headers = {'User-Agent': user_agent}
response = (url,headers=headers)
html =
return html
if __name__=="__main__":
page=input('请输⼊要爬取的页⾯:')
html=loadPage(page)
# with open('a.html','w') as f:
#    f.write(html)
# 到所有的段⼦内容<div class="f18 mb20"></div>
# re.S 如果没有re.S 则是只匹配⼀⾏有没有符合规则的字符串,如果没有则下⼀⾏重新匹配
# 如果加上re.S 则是将所有的字符串将⼀个整体进⾏匹配,到(.*?)组⾥⾯的内容
pattern=repile(r'<div.*?class="f18 mb20">(.*?)</div>',re.S)#匹配规则
item_list=pattern.findall(html)#到所有符合条件的
for item in item_list:
#去除html标签
item = place("<p>", "").replace("</p>", "").replace("<br />", "")
#'a'以追加的⽅式把内容写⼊⽂件
with open('a.txt','a',encoding='utf-8') as f:
f.write(item)
print(item)
2.使⽤XPath下载图⽚
import requests
from lxml import etree
def getGirlInedx(url):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}    (url=url,headers=headers).text
content=etree.HTML(html)
link_list=content.xpath('//img[@class="BDE_Image"]//@src')
for item in link_list:
loadImage(item)
#爬取图⽚
def loadImage(linkurl):
print(linkurl)
#保存图⽚到本地
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}    filename=linkurl[-10:]
(linkurl)
with open("image/"+filename,'wb') as f:
f.t)
if __name__=="__main__":
url = "tieba.baidu/p/5680998501"
getGirlInedx(url)
什么是XPath?
XPath (XML Path Language) 是⼀门在 XML ⽂档中查信息的语⾔,可⽤来在 XML ⽂档中对元素和属性进⾏遍历。
W3School官⽅⽂档:
XPath 开发⼯具
1. 开源的XPath表达式编辑⼯具:XMLQuire(XML格式⽂件可⽤)
2. Chrome插件 XPath Helper
3. Firefox插件 XPath Checker
选取节点
XPath 使⽤路径表达式来选取 XML ⽂档中的节点或者节点集。这些路径表达式和我们在常规的电脑⽂件系统中看到的表达式⾮常相似。下⾯列出了最常⽤的路径表达式:
表达式描述
nodename选取此节点的所有⼦节点。
/从根节点选取。
//从匹配选择的当前节点选择⽂档中的节点,⽽不考虑它们的位置。
.选取当前节点。
..选取当前节点的⽗节点。
@选取属性。
在下⾯的表格中,我们已列出了⼀些路径表达式以及表达式的结果:
路径表达式结果bookstore选取 bookstore 元素的所有⼦节点。
/bookstore选取根元素 bookstore。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
bookstore/book选取属于 bookstore 的⼦元素的所有 book 元素。
//book选取所有 book ⼦元素,⽽不管它们在⽂档中的位置。
bookstore//book选择属于 bookstore 元素的后代的所有 book 元素,⽽不管它们位于 bookstore 之下的什么位置。
//@lang选取名为 lang 的所有属性。
谓语(Predicates)
谓语⽤来查某个特定的节点或者包含某个指定的值的节点,被嵌在⽅括号中。
在下⾯的表格中,我们列出了带有谓语的⼀些路径表达式,以及表达式的结果:
路径表达式结果
/bookstore/book[1]选取属于 bookstore ⼦元素的第⼀个 book 元素。
/bookstore/book[last()]选取属于 bookstore ⼦元素的最后⼀个 book 元素。
/bookstore/book[last()-1]选取属于 bookstore ⼦元素的倒数第⼆个 book 元素。
/bookstore/book[position()<3]选取最前⾯的两个属于 bookstore 元素的⼦元素的 book 元素。
//title[@lang]选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang=’eng’]选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00]选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须⼤于 35.00。
/bookstore/book[price>35.00]/title选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须⼤于 35.00。
选取未知节点
XPath 通配符可⽤来选取未知的 XML 元素。
通配符描述
*匹配任何元素节点。
@*匹配任何属性节点。
node()匹配任何类型的节点。
在下⾯的表格中,我们列出了⼀些路径表达式,以及这些表达式的结果:
路径表达式结果
/bookstore/*选取 bookstore 元素的所有⼦元素。
//*选取⽂档中的所有元素。
//title[@*]选取所有带有属性的 title 元素。
路径表达式结果
选取若⼲路径
通过在路径表达式中使⽤“|”运算符,您可以选取若⼲个路径。
实例
在下⾯的表格中,我们列出了⼀些路径表达式,以及这些表达式的结果:
路径表达式结果
//book/title | //book/price选取 book 元素的所有 title 和 price 元素。
//title | //price选取⽂档中的所有 title 和 price 元素。
/bookstore/book/title | //price选取属于 bookstore 元素的 book 元素的所有 title 元素,以及⽂档中所有的 price 元素。
XPath的运算符
下⾯列出了可⽤在 XPath 表达式中的运算符:
lxml库
lxml 是⼀个HTML/XML的解析器,主要的功能是如何解析和提取 HTML/XML 数据。
lxml和正则⼀样,也是⽤ C 实现的,是⼀款⾼性能的 Python HTML/XML 解析器,我们可以利⽤之前学习的XPath语法,来快速的定位特定元素以及节点信息。
lxml python 官⽅⽂档:
需要安装C语⾔库,可使⽤ pip 安装:pip install lxml(或通过wheel⽅式安装)
初步使⽤
我们利⽤它来解析 HTML 代码,简单⽰例:
# lxml_test.py
# 使⽤ lxml 的 etree 库
from lxml import etree
text = '''
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a> # 注意,此处缺少⼀个 </li> 闭合标签
</ul>
</div>
'''
#利⽤etree.HTML,将字符串解析为HTML⽂档
html = etree.HTML(text)
# 按字符串序列化HTML⽂档
result = string(html)
print(result)
输出结果:
<html><body>
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a></li>
</ul>
</div>
</body></html>
lxml 可以⾃动修正 html 代码,例⼦⾥不仅补全了 li 标签,还添加了 body,html 标签。⽂件读取:
除了直接读取字符串,lxml还⽀持从⽂件⾥读取内容。我们新建⼀个hello.html⽂件:<!-- hello.html -->
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html"><span class="bold">third item</span></a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a></li>
</ul>
</div>
再利⽤ etree.parse() ⽅法来读取⽂件。
# lxml_parse.py
from lxml import etree
# 读取外部⽂件 hello.html
html = etree.parse('./hello.html')
result = string(html, pretty_print=True)
print(result)
输出结果与之前相同:
<html><body>
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>字符串截取倒数第二个
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a></li>
</ul>
</div>
</body></html>
XPath实例测试
1. 获取所有的<li>标签
# xpath_li.py
from lxml import etree
html = etree.parse('hello.html')
print type(html)  # 显⽰etree.parse() 返回类型
result = html.xpath('//li')
print result  # 打印<li>标签的元素集合
print len(result)
print type(result)
print type(result[0])
输出结果:
<type '_ElementTree'>
[<Element li at 0x1014e0e18>, <Element li at 0x1014e0ef0>, <Element li at 0x1014e0f38>, <Element li at 0x1014e0f80>, <Element li at 0x1014e0fc8>] 5
<type 'list'>
<type '_Element'>
2. 继续获取<li>标签的所有class属性
# xpath_li.py
from lxml import etree
html = etree.parse('hello.html')
result = html.xpath('//li/@class')
print(result)
运⾏结果
['item-0', 'item-1', 'item-inactive', 'item-1', 'item-0']
3. 继续获取<li>标签下hre为link1.html的<a>标签
# xpath_li.py
from lxml import etree
html = etree.parse('hello.html')
result = html.xpath('//li/a[@href="link1.html"]')
print(result)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。

合并回文子串牛客题解
« 上一篇
计算机二级C上机考试简单应用题
下一篇 »

发表评论

推荐文章

热门文章

最新文章

标签列表