【发布时间】:2018-06-25 11:56:07
【问题描述】:
考虑以下代码:
<div class="tag1">
<div>
<a class="tag11 tag12" href="http://www.example.com/file1" title="file1"><img class="tag2" src="http://www.example.com/img1.jpg" alt="textalt">linktext</a>
<span class="tag3">.</span>
</div>
<div>
<a class="tag11 tag12" href="http://www.example.com/file2" title="file2"><img class="tag2" src="http://www.example.com/img1.jpg" alt="textalt">linktext</a>
<span class="tag3">.</span>
</div>
这是一个较大的 html 页面的 部分,其中包含带有其他标签的其他 a 元素。但是,我想only 引用类为tag11 tag12 的a 元素,并创建一个包含所有href 值的列表。 tag11 和 tag12 之间有一个空格。
使用 Python 3.5、lxml 和 xpath,这是第一次尝试:
from lxml import html
import requests
page = requests.get('http://www.example.com/page.html')
tree = html.fromstring(page.content)
atest = tree.xpath('//a[contains(@class='tag11 tag12')]')
但它不起作用。使用单个顶点:
File "<stdin>", line 1
buyers = tree.xpath('//a[contains(@class='tag11 tag12')]')
^
SyntaxError: invalid syntax
使用双顶点:
tree.xpath('//a[contains(@class="tag11 tag12")]')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "src/lxml/lxml.etree.pyx", line 1587, in lxml.etree._Element.xpath (src/lxml/lxml.etree.c:61854)
File "src/lxml/xpath.pxi", line 307, in lxml.etree.XPathElementEvaluator.__call__ (src/lxml/lxml.etree.c:178516)
File "src/lxml/xpath.pxi", line 227, in lxml.etree._XPathEvaluatorBase._handle_result (src/lxml/lxml.etree.c:177421)
lxml.etree.XPathEvalError: Invalid number of arguments
另外(来自this answer):
atest = tree.xpath('//a[contains(@class, "tag11") and contains(@class, "tag12")]')
得到一个空的atest列表。
如何正确处理class标签中包含空格的a元素?
我正在使用 Python 3.5、lxml 和 xpath,因为我正在尝试学习这些工具。因此,没有特别的理由不使用 BeautifulSoup,但我只是在为这些列出的工具寻找特定的解决方案,如果有的话。
【问题讨论】:
-
我不是 Python 开发人员,但您可能需要转义单引号。你试过
'//a[@class = \'tag11 tag12\']'吗?或tree.xpath('//a[contains(@class, \'tag11\') and contains(@class, \'tag12\')]') -
@derloopkat 谢谢。第一个产生错误;第二个创建(我猜)原始元素列表:
[<Element a at 0x7f3a47b5c6d8>, <Element a at 0x7f3a440e2818>]。不是实际的href字符串。
标签: html python-3.x xpath web-scraping lxml