【问题标题】:lxml How Can I Target And Retrieve Multiple Element Values?lxml 如何定位和检索多个元素值?
【发布时间】:2020-03-03 02:22:44
【问题描述】:

请考虑以下 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']

这有可能吗?我得到了上述代码,任何帮助将不胜感激。非常感谢。

【问题讨论】:

  • 您是否尝试打印tree 的属性?也许有一种方法可以通过调查来获取这些字符串。

标签: python lxml screen-scraping


【解决方案1】:

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

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

【讨论】:

  • 谢谢,这适用于 [i.text for i in e]。对“工会”印象深刻。我不知道!
【解决方案2】:

我对 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)

希望这会有所帮助!

【讨论】:

    【解决方案3】:

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

    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']]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多