美文网首页
lxml 提取遇到的问题

lxml 提取遇到的问题

作者: 木下瞳 | 来源:发表于2019-07-24 23:58 被阅读0次

了解更多的爬虫关注微信公众号“木下学Python”吧~

爬取结构

res = requests.get(url,headers = headers)

selector =  etree.HTML(res.text) #获得格式化的 HTML 源码

url_infos = selector.xpath('xpath路径') #抓大标签

for url_info in url_infos:

    url_info.xpath('。。')[0]

    。。。。。。

抓大标签以后,url_info.xpath('。。')[0] 中的路径不能在此外,只能 < 其路径,不能 =

把不合法的 HTML 解析为统一格式

 selector = etree.HTML(res.text)

 from lxml.html import fromstring,tostring 

 broken_html = '...'

tree = fromstring(broken_html) #解析 HTNL

fixed_html = tostring(tree,pretty_print=True)

url_info.xpath('string(.)').strip():
https://www.cnblogs.com/thunderLL/p/8038927.html

抓目前选中标签中的所有 文本 信息

url_info.xpath('//*[@id="info"]/text()[2]'):
出现类似text()【2】这种情况改用正则好一点

url_info.xpath('//h1[@class="title"]/text()'):
当第一个标签是带有属性值时,开头是'//',不是'/'

        url_info.xpath('//h1[@class="title"]/text()')对

        url_info.xpath('/h1[@class="title"]/text()')错

当 url_info.xpath('') 路径没问题的时候:
例如有三个标签他们是同一个路径里面,分别是:

                 1).xpath('//div[@class="meta"]/span[1]/text()')[0]

                 2).xpath('//div[@class="meta"]/span[2]/text()')[0]

                 3).xpath('//div[@class="meta"]/span[1]/text()')[0]

      1)和2)都没问题,但到了3)就匹配不出来,这时候查看网页源代码搜索,发现3)匹配的元素不在里面,1),2)都可以          搜索到,说明3)号元素采用了异步加载技术,但要匹配的内容在源代码的<script>标签中,用正则匹配

“*”
可以使用 * 来选择指定层级的所有元素

这个节点下的所有节点

包含选取
‘//a[contains(@href,'baidu')]’ 提取连接中包含了 baidu 的链接

'//a[starts-with(@href,'http://www.')]' 提取链接中开头为 http://www. 的链接

‘//a[not(contains(@href,'abc))]’ ti提取连接中不包含 abc 的链接

“.” 当前节点
表示当前节点,当 xpath路径正确,而结果有问题时,可以这样写

.xpath('./h3/a/@title') 提取结果正确

.xpath('/h3/a/@title') 提取结果错误

.xpath(.//div[last()]) ,last() 函数
选择当前节点的最后一个,如果想选择倒数第二个就是 last() - 1,以此类推

相关文章

网友评论

      本文标题:lxml 提取遇到的问题

      本文链接:https://www.haomeiwen.com/subject/pvvqrctx.html