还是爬取必应在线词典的内容。
实现代码主要用到了BeautifulSoup的select和w3lib.html的remove_tags,具体实现很简单,主要是确定所要爬取的例句在页面源代码中处于什么位置,即如下所示的标签顺序:
div> div > div > div > div.se_n_d
div > div > div > div > div > div > span.b_regtxt
div > div > div > div > div > div > a.p1-8.b_regtxt
直接通过观察定位很困难,可以借助于PaCharm的有关功能,具体如下所述:
1)首先在Bing在线词典查询一个单词,确定Bing提供了这个单词的注音、释义与例句(有缺少的内容不行);
2)查看页面源代码,将所有源代码复制并粘贴到本地一个HTML文件;
3)使用PaCharm打开2)所新建的HTML文件;
4)在PaCharm的工具栏中选择Code选项,并选中Reformat Code,如图1所示;
4)此时将光标移动到HTML文件的任何位置,底部都会显示当前光标所在位置的标签顺序,如图2所示;
5)(据说有个功能可以直接把标签路径提取出来,但我没找到,而是……)把底部的标签顺序记下来并放到Python程序的
相应位置。注意:并不是需要记录Pacharm底部所示的完整标签路径,而是从当前光标所在代码块的起始处记录,对于图2中的”
程序代码“,它的起初位置如图4所示。
接着是准备数据,将含有待爬取例句单词的文件放在指定文件夹下,如图5所示,并将相应路径填入代码中。
所用Python代码如下所示。
import urllib.request
import re
from bs4 import BeautifulSoup
myRule5 = r'((http|ftp|https)://)?(([a-zA-Z0-9\._-]+\.[a-zA-Z]{2,6})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,4})*(/[a-zA-Z0-9\&%_\./-~-]*)?'
compile_name5 = re.compile(myRule5, re.M)
myRule6 = r'.*?\.com|.*?\.cn'
compile_name6 = re.compile(myRule6, re.M)
def readData(dataPath, fileName):
file = open(dataPath + fileName, 'r', encoding='UTF-8')
nameList = file.readlines()
return nameList
def grab(dataPath, fileName, resultPath, style):
nameList = readData(dataPath, fileName)
for word in nameList:
# web_addr = "https://cn.bing.com/dict/search?q=" + str(EnglishWord) + "&qs=n&form=Z9LH5&sp=-1&pq=" + str(EnglishWord) + "&sc=8-8&sk=&cvid=AA1C8A024F484889A4B788484086A7DF"
# url = "https://cn.bing.com/dict/search?q=" + str(word).replace("\n", "") + "&qs=n&form=Z9LH5&sp=-1&pq=" + str(word).replace("\n", "") + "&sc=8-8&sk=&cvid=AA1C8A024F484889A4B788484086A7DF"
url = "https://cn.bing.com/dict/search?q=" + str(word).replace("\n", "")
res = urllib.request.urlopen(url)
res.encoding = 'utf-8'
resp = urllib.request.urlopen(url)
# 读取网页源码内容
text = resp.read()
soup = BeautifulSoup(text, style)
print("word = " + str(word))
myList = open(resultPath + str(word).replace("\n", "") + ".txt", mode='w', encoding='utf-8')
# numbers = soup.select('div> div > div > div > div.se_n_d')
# acronyms = soup.select('div > div > div > div > div > div > span.b_regtxt')
# English_Words = soup.select('div > div > div > div > div > div > a.p1-8.b_regtxt')
all = soup.select('div > div > d