我从 Python3
上的 lxml
开始使用 XPATH
,但我无法获得正确的 sintaxis 来选择所有 li
元素的内容为 ul
。我正在尝试使用这种结构:
<body>
<div> ..... </div>
<div> ..... </div>
<div id="div-A">
<div id="subdiv-1">
<form> ... </form>
<div> ..... </div>
<div> ..... </div>
<ul>
<li>
<div id="div-1">
<div> ..... </div>
<div> ..... </div>
<div id="subdiv-1">
<a class="name">
<span>
....text1....
</span>
</a>
</div>
<div id="subdiv-2">
<div class="class-1">
<div class="subClass-1">
<div> ....text2.... </div>
</div>
<span class="subClass-2">
....text3....
</span>
</div>
</div>
</div>
</li>
... x23...
</ul>
</div>
</div>
</body>
我的目标是能够获得 text1、text2 和 text3。
首先,我尝试获取所有 li
元素及其内容:
content = html_response.content
fixed_content = fromstring(content) # parse the HTML and correct malformed HTML
items = fixed_content.xpath('//ul/li/*')
并将 items
传递给一个带有 for 循环的函数,以迭代 23 个 li
元素。现在我尝试获取文本,所以:
for item in items:
text1 = item.xpath('/div[@id="div-1"]/div[@id="subdiv-1"]/a[@class="name"]/span').text_content()
text2 = item.xpath('/div[@id="div-1"]/div[@id="subdiv-2"]/div[@class="class-1"]/div[@class="subClass-1"]/div').text_content()
text3 = item.xpath('/div[@id="div-1"]/div[@id="subdiv-2"]/div[@class="class-1"]/div[@class="subClass-2"]/span[@class="subClass-2"]').text_content()
但是我在所有情况下都得到一个没有内容的空结果。我做错了什么?
问候。
最佳答案
尝试以下代码以获得所需的输出:
items = fixed_content.xpath('//ul/li//span | //ul/li//div[@class="subClass-1"]')
for item in items:
item.text_content().strip()
输出是
'....text1....'
'....text2....'
'....text3....'
或
items = fixed_content.xpath('//ul/li')
for item in items:
text1 = item.xpath('.//a[@class="name"]/span')[0].text_content().strip()
text2 = item.xpath('.//div[@class="subClass-1"]')[0].text_content().strip()
text3 = item.xpath('.//span[@class="subClass-2"]')[0].text_content().strip()
如果你想把每个文本节点作为变量
关于html - 使用 xpath 从 ul 中选择 li 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52092180/