Python中关于lxml库的用法请教
在爬虫中,用 Request()方法返回的 response 对象,请问要如何与 lxml 结合在一起使用呢?
例如 response.xpath(’//div[@class=“A”]’) 这个语句要改为用 reponse 和 lxml 表示该怎么写呢?
谢谢
Python中关于lxml库的用法请教
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个链接
常见坑:
- XPath返回的是列表,即使只有一个元素
- HTML解析用
html.fromstring(),XML用etree.fromstring() - 注意编码问题,特别是中文网站
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
[doc]( https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/index.html “doc”)
谢谢指点,我也有了解过 BS4,看了某些材料说除了正则,效率最快的是 lxml,BS4 虽然很友好但是效率相对较低,是这样么?
趁早改投 pyquery 门下吧……
怎么会效率低,你可以使用不同解析器去解析 html,比如你提到的 lxml 都是可以使用的,所以效率问题不大
Scrapy 本身就自动会使用 lxml,这是它的一个依赖包。Scrapy 本来已经自动使用 lxml 帮你处理好了,你直接写 XPath 就好了,可你偏要自己再用 lxml 处理一遍。

