Python中关于lxml库的用法请教

在爬虫中,用 Request()方法返回的 response 对象,请问要如何与 lxml 结合在一起使用呢?
例如 response.xpath(’//div[@class=“A”]’) 这个语句要改为用 reponse 和 lxml 表示该怎么写呢?
谢谢
Python中关于lxml库的用法请教

9 回复

lxml是处理XML/HTML的利器,核心是etree和html两个模块。

解析:

from lxml import etree, html

# XML解析
xml_str = '<root><a>text</a></root>'
root = etree.fromstring(xml_str)  # 字符串解析
tree = etree.parse('file.xml')    # 文件解析

# HTML解析(自动补全标签)
html_str = '<div><p>content</p></div>'
doc = html.fromstring(html_str)

XPath查找(最常用):

# 基本查找
elements = root.xpath('//a')                    # 所有<a>标签
elements = root.xpath('//a[@class="link"]')     # 带class属性的<a>
elements = root.xpath('//a/text()')             # 获取文本
elements = root.xpath('//a/@href')              # 获取属性

# 示例:提取所有链接
links = doc.xpath('//a/@href')
for link in links:
    print(link)

CSS选择器:

elements = doc.cssselect('div.content > p')

修改内容:

# 修改文本和属性
element = root.xpath('//a')[0]
element.text = 'new text'
element.set('href', 'new_link.html')

# 添加/删除元素
new_elem = etree.Element('new_tag')
element.append(new_elem)
element.remove(old_elem)

命名空间处理:

# 带命名空间的XML
ns = {'ns': 'http://example.com'}
elements = root.xpath('//ns:tag', namespaces=ns)

编码处理:

# 输出时指定编码
result = etree.tostring(root, encoding='utf-8', pretty_print=True)

实际爬虫示例:

import requests
from lxml import html

url = 'https://example.com'
response = requests.get(url)
tree = html.fromstring(response.content)

# 提取标题和所有链接
title = tree.xpath('//title/text()')[0]
links = tree.xpath('//a/@href')

print(f"标题: {title}")
print("链接:", links[:5])  # 前5个链接

常见坑:

  1. XPath返回的是列表,即使只有一个元素
  2. HTML解析用html.fromstring(),XML用etree.fromstring()
  3. 注意编码问题,特别是中文网站

lxml比内置的xml模块快得多,XPath语法熟练后效率很高。

如果你非要字典有 Scrapy 的情况下还手动用 lxml 的话,

python<br>from lxml.html import fromstring<br>selector = fromstring(response.body.decode())<br>selector.xpath('//div[@class="A"]')<br>

我初学爬虫,想用一些最主流的模式和包来实现功能。我知道 Scrapy 是最好用的架构,所以肯定要用的,另外据说 lxml 是 Python 语言里和 XML 以及 HTML 工作的功能最丰富和最容易使用的库。所以我才产生了如何在 Scrapy 下使用 lxml 的念头,当然这在各位前辈看来却可能是很不合理的搭配。
按照您的意思,是不是既然使用了 Scrapy 架构,就用 xpath 来解析 XML 和 HTML 即可,不要再使用 lxml 了?
谢谢指点!


谢谢指点,我也有了解过 BS4,看了某些材料说除了正则,效率最快的是 lxml,BS4 虽然很友好但是效率相对较低,是这样么?

趁早改投 pyquery 门下吧……

怎么会效率低,你可以使用不同解析器去解析 html,比如你提到的 lxml 都是可以使用的,所以效率问题不大

Scrapy 本身就自动会使用 lxml,这是它的一个依赖包。Scrapy 本来已经自动使用 lxml 帮你处理好了,你直接写 XPath 就好了,可你偏要自己再用 lxml 处理一遍。

回到顶部