簡體   English   中英

lxml 如何定位和檢索多個元素值?

[英]lxml How Can I Target And Retrieve Multiple Element Values?

請考慮以下 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']]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM