Web Scraping with Python深入HTML解析_html/css_WEB-ITnose
同样我们在抓取网页的时候,需要去掉我们不需要的,提取出需要的信息,只不过技术相当复杂。这篇文章将介绍HTML解析技术
在上篇文章( Web Scraping with Python--第一个网页抓取实例)中,我们初步接触了BeutifulSoup库, 这里我们将通过属性来查找标签tags。
几乎所有的网站都包含CSS,对我们抓取网页很有利,CSS依赖于不同的HTML元素有不同的标记,比如:
来看一个网站-http://www.pythonscraping.com/pages/warandpeace.html,里面是一篇文章,口语是红色的字体,而讲话者是绿色的字体,选取其中一个源代码片段:
"Heavens! what a virulent attack!" replied the prince, not in the least disconcerted by this reception.
可以使用上一篇文章中使用的程序来创建一个BeautifulSoup对象来获取整个网页:
from urllib.requestimport urlopenfrom bs4import BeautifulSouphtml = urlopen("http://www.pythonscraping.com/pages/warandpeace.html")bsObj = BeautifulSoup(html)
使用BeautifulSoup对象的findAll方法来提取出一个指定要求的列表
nameList = bsObj.findAll("span", {"class":"green"})for namein nameList: print(name.get_text())
将上面的代码证整理一下:
from urllib.requestimport urlopenfrom bs4import BeautifulSoup html = urlopen("http://www.pythonscraping.com/pages/warandpeace.html")bsObj = BeautifulSoup(html, "html.parser")nameList = bsObj.findAll("span", {"class": "green"})for namein nameList: print(name.get_text())
运行结果:
Anna
Pavlovna Scherer
Empress Marya
……
解释一下上面的代码:
bsObj.findAll(tagName, tagAttributes) 获取整个页面上的标签的列表,然后通过迭代列表,获取相应的标签的内容
find() 和 findAll()
这两个方法很相似,它们的声明如下:
findAll(tag, attributes, recursive, text, limit, keywords)find(tag, attributes, recursive, text, keywords)
tag参数就像之前见到的那样,你可以传递一个字符串或者一个字符串列表:.findAll({"h1","h2","h3","h4","h5","h6"})
attributes参数传递一个属性和tags相匹配的字典,例如:.findAll("span", {"class":"green", "class":"red"})
recursive参数用于设置是否设置递归
keywor参数允许你包含一个特别的属性,例如:
from urllib.requestimport urlopenfrom bs4import BeautifulSoup html = urlopen("http://www.pythonscraping.com/pages/warandpeace.html")bsObj = BeautifulSoup(html, "html.parser")allText = bsObj.findAll(id="text")#也可以换为:allText = bsObj.findAll("",{"id":"text"})print(allText[0].get_text())
如果你想查找子标签,可以使用children:
from urllib.requestimport urlopenfrom bs4import BeautifulSoup html = urlopen("http://www.pythonscraping.com/pages/page3.html")bsObj = BeautifulSoup(html, "html.parser")for childin bsObj.find("table", {"id": "giftList"}).children: print(child)
如果想去掉第一行的
from urllib.requestimport urlopenfrom bs4import BeautifulSoup html = urlopen("http://www.pythonscraping.com/pages/page3.html")bsObj = BeautifulSoup(html, "html.parser")for siblingin bsObj.find("table", {"id":"giftList"}).tr.next_siblings: print(sibling)
如果你想查找父标签,可以使用 previous_siblings:
from urllib.requestimport urlopenfrom bs4import BeautifulSoup html = urlopen("http://www.pythonscraping.com/pages/page3.html")bsObj = BeautifulSoup(html, "html.parser")print(bsObj.find("img",{"src":"../img/gifts/img1.jpg"}).parent.previous_sibling.get_text())
从下面的html结构一目了然
—
—
—
— “$15.00” (4)
— s
— (1)
正则表达式与 BeautifulSoup
python中的正则可以参照我的另一篇《 Python基础(9)--正则表达式》
注意到上面的实例网页中有如下结构:
假如有个需求是提取所有的img标签,按照之前的说法,可以考虑 findAll("img")来解决这个问题,但是现代网站有的隐藏img……等不确定因素,这时候才有正则表达式来解决:
from urllib.requestimport urlopenfrom bs4import BeautifulSoupimport re html = urlopen("http://www.pythonscraping.com/pages/page3.html")bsObj = BeautifulSoup(html, "html.parser")images = bsObj.findAll("img", {"src":re.compile("\.\.\/img\/gifts/img.*\.jpg")})for imagein images: print(image["src"])
运行结果如下:
../img/gifts/img1.jpg
../img/gifts/img2.jpg
../img/gifts/img3.jpg
../img/gifts/img4.jpg
../img/gifts/img6.jpg
作者:工学1号馆
出处: http://wuyudong.com/1842.html
本文版权归作者所有,欢迎转载,在文章页面明显位置给出原文链接,否则保留追究法律责任的权利.
如果觉得本文对您有帮助,可以对作者进行小额【赞助】
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
相关文章
相关视频
专题推荐
-
独孤九贱-php全栈开发教程
全栈 170W+
主讲:Peter-Zhu 轻松幽默、简短易学,非常适合PHP学习入门
-
玉女心经-web前端开发教程
入门 80W+
主讲:灭绝师太 由浅入深、明快简洁,非常适合前端学习入门
-
天龙八部-实战开发教程
实战 120W+
主讲:西门大官人 思路清晰、严谨规范,适合有一定web编程基础学习
推荐阅读
-
使用 XPATH 和 HTML Cleaner 解析 HTML/XML(Using XPATH and HTML Cleaner to parse HTML / XML)_html/css_WEB-ITnose
-
用python正则如何去掉下面文本三个_html/css_WEB-ITnose
-
[译](深入了解CSS Box Shadow)_html/css_WEB-ITnose
-
织梦标签解析,不懂标签什么意思的可以进来看看www.vpincha.cc_html/css_WEB-ITnose
-
jsoup解析HTML_html/css_WEB-ITnose
-
用python正则如何去掉下面文本三个_html/css_WEB-ITnose
-
float的深入剖析_html/css_WEB-ITnose
-
CSS定位深入理解 完全掌握CSS定位 相对定位和绝对定位_html/css_WEB-ITnose
-
Python-Passing a matplotlib figure to HTML (flask)_html/css_WEB-ITnose
-
解析css3 shake 抖动样式_html/css_WEB-ITnose
网友评论
文明上网理性发言,请遵守 新闻评论服务协议
我要评论