爬虫学习2.2 使用xpath提取丁香园论坛的回复内容
任务描述
学习xpath,使用lxml+xpath提取内容。
使用xpath提取丁香园论坛的回复内容。
丁香园直通点:http://www.dxy.cn/bbs/thread/626626#626626 。
参考资料:https://blog.****.net/naonao77/article/details/88129994
话不多说,先上代码:
def getHTMLText(url):
try:
r = requests.get(url)
r.raise_for_status()
return r.text
except:
print("getHTMLText error!")
return ""
def parsePage(text):
htmlInfo = {}
try:
html = etree.HTML(text)
names = html.xpath('//div[@class = "auth"]/a/text()')
contents = html.xpath("//td[@class = 'postbody']")
for i in range(len(names)):
htmlInfo[names[i]] = contents[i].xpath('string()').strip()
except:
print("parsePage error!")
return htmlInfo
def printHTMLInfo(htmlInfo):
tplt = "{:}\t\t{:}"
print(tplt.format("name", "content"))
for key, value in htmlInfo.items():
print(tplt.format(key, value), end='\n\n')
def main():
url = "http://www.dxy.cn/bbs/thread/626626"
text = getHTMLText(url)
htmlInfo = parsePage(text)
printHTMLInfo(htmlInfo)
main()
效果如图:
思路:
- 复用上一次的代码,仅需更改parsePage这个解析HTML文本的函数
- 提取的标签和上一篇 https://blog.****.net/wxl1999/article/details/89096765 完全相同,只是换了一个写法
html = etree.HTML(text)
names = html.xpath('//div[@class = "auth"]/a/text()')
contents = html.xpath("//td[@class = 'postbody']")
for i in range(len(names)):
htmlInfo[names[i]] = contents[i].xpath('string()').strip()
- 其中涉及到的lxml以及xpath的相关语法可以参考 https://cuiqingcai.com/2621.html
https://blog.****.net/naonao77/article/details/88129994 - 对于回复内容的提取,我原先使用的是xpath中的text(),但由于部分回复中存在链接及回车等标签干扰,会导致属于同一人的文本被分割开,于是改用string()
学习过程中得知,丁香园论坛的内容需要登录后才能看到完整的,这涉及到模拟登陆的问题,然而我还不会,等后面学到了再完善吧