l xml Как можно настроить таргетинг и получить значения нескольких элементов? - PullRequest
1 голос
/ 03 марта 2020

пожалуйста, обратите внимание на следующее 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>

Используя l xml, я легко могу получить 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']

Возможно ли это как-то? Я получил, насколько выше код, и любая помощь будет принята с благодарностью. Спасибо, любезно.

Ответы [ 3 ]

1 голос
/ 03 марта 2020

Вы можете использовать объединение, которое возвращает результат в порядке документа.

e=tree.xpath("//li/h5|//li/div/span")
0 голосов
/ 04 марта 2020

Другое решение, может быть, вам понравится.

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']]
0 голосов
/ 03 марта 2020

Я не очень знаком с l xml, но я работал с красивым супом. Если у вас все в порядке с переключением, попробуйте следующий код:

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)

Надеюсь, это поможет!

...