lxml如何定位和检索多个元素值



请考虑以下HTML:

<html>
<body>
<ul>
<li><h5>Title 1</h5><div><span>Apples</span></li>
<li><h5>Title 2</h5><div><span>Bananas</span></li>
<li><h5>Title 3</h5><div><span>Grapes</span></li>
<li><h5>Title 4</h5><div><span>Pears</span></li>
</ul>
</body>
</html>

使用lxml,我可以很容易地检索h5的:

from lxml import html
example_html = '''<html>
<body>
<ul>
<li><h5>Title 1</h5><div><span>Apples</span></li>
<li><h5>Title 2</h5><div><span>Bananas</span></li>
<li><h5>Title 3</h5><div><span>Grapes</span></li>
<li><h5>Title 4</h5><div><span>Pears</span></li>
</ul>
</body>
</html>'''
tree = html.fromstring(example_html)
element_list = tree.xpath('//h5')
# List comprehension to get text
result = [i.text for i in element_list]
print(result)

根据该代码,结果当然是:

['Title 1', 'Title 2', 'Title 3', 'Title 4']

但我需要知道如何产生这样的结果:

['Title 1', 'Apples', 'Title 2', 'Bananas', 'Title 3', 'Grapes', 'Title 4', 'Pears']

我试着这样修改代码:

collector = []
for i in element_list:
h5 = i.xpath('//h5')
collector.append(h5[0].text)
span = i.xpath('//span')
collector.append(span[0].text)
print(collector)

但得到了这个结果(接近但不完全(:

['Title 1', 'Apples', 'Title 1', 'Apples', 'Title 1', 'Apples', 'Title 1', 'Apples']

这有可能吗?我已经完成了上面的代码,任何帮助都将不胜感激。谢谢。

您可以使用并集,它按文档顺序返回结果。

e=tree.xpath("//li/h5|//li/div/span")

我对lxml不是很熟悉,但我处理过漂亮的汤。如果你可以切换,请尝试以下代码:

from bs4 import BeautifulSoup
example_html = '''<html>
<body>
<ul>
<li><h5>Title 1</h5><div><span>Apples</span></li>
<li><h5>Title 2</h5><div><span>Bananas</span></li>
<li><h5>Title 3</h5><div><span>Grapes</span></li>
<li><h5>Title 4</h5><div><span>Pears</span></li>
</ul>
</body>
</html>'''
soup = BeautifulSoup(example_html, 'html.parser')
list = []
for elem in soup.findAll('li'):
list.append(elem.find('h5').text)
list.append(elem.find('span').text)
print(list)

希望这能有所帮助!

另一个解决方案,也许你会喜欢它。

from simplified_scrapy import SimplifiedDoc
html = '''<html>
<body>
<ul>
<li><h5>Title 1</h5><div><span>Apples</span></li>
<li><h5>Title 2</h5><div><span>Bananas</span></li>
<li><h5>Title 3</h5><div><span>Grapes</span></li>
<li><h5>Title 4</h5><div><span>Pears</span></li>
</ul>
</body>
</html>'''
doc = SimplifiedDoc(html)
lis = doc.selects('li>(h5,span)')
print (lis)

结果:

[['Title 1', 'Apples'], ['Title 2', 'Bananas'], ['Title 3', 'Grapes'], ['Title 4', 'Pears']]

相关内容

  • 没有找到相关文章

最新更新