lxml可以不区分大小写地工作吗?
我正在尝试从一些随机的网站上抓取META关键词和描述标签。显然,我无法控制这些网站,所以只能接受它们提供的内容。这些标签和属性的大小写各不相同,这就意味着我需要不区分大小写地处理它们。我真不敢相信lxml的作者居然这么固执,非要坚持完全遵循标准,结果却让很多人无法好好使用他们的库。
我希望能够使用 doc.cssselect('meta[name=description]')
(或者一些XPath的替代方法),但这样做无法抓到 <meta name="Description" Content="...">
这样的标签,因为大写的D就不行。
我现在用的这个方法是个变通办法,但实在是太糟糕了!
for meta in doc.cssselect('meta'):
name = meta.get('name')
content = meta.get('content')
if name and content:
if name.lower() == 'keywords':
keywords = content
if name.lower() == 'description':
description = content
看起来标签名 meta
是不区分大小写的,但属性却不是。如果 meta
也区分大小写,那就更让人头疼了!
3 个回答
0
你可以使用
doc.cssselect.xpath("//meta[translate(@name,
'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz')='description']")
这个代码会把“name”的值转换成小写,然后进行匹配。
你还可以看看:
2
lxml 是一个用来解析 XML 的工具。XML 是区分大小写的,也就是说大写和小写字母是不同的。你现在要解析的是 HTML,所以应该使用一个专门的 HTML 解析工具。BeautifulSoup 就是一个非常受欢迎的选择。不过,它的一个缺点是速度可能比较慢。
9
属性的值是区分大小写的,也就是说大写和小写是不同的。
你可以使用任意的正则表达式来选择一个元素:
#!/usr/bin/env python
from lxml import html
doc = html.fromstring('''
<meta name="Description">
<meta name="description">
<META name="description">
<meta NAME="description">
''')
for meta in doc.xpath('//meta[re:test(@name, "^description$", "i")]',
namespaces={"re": "http://exslt.org/regular-expressions"}):
print html.tostring(meta, pretty_print=True),
输出结果:
<meta name="Description">
<meta name="description">
<meta name="description">
<meta name="description">