Python xpath возвращает пустой список - exilead - PullRequest
0 голосов
/ 15 ноября 2018

Я довольно плохо знаком с Python. Я пытаюсь получить количество результатов поиска по запросу в Exilead. В этом примере я бы хотел получить 586 564 результатов ".

Это код, который я использую:

r = requests.get(URL, headers=headers)
tree = html.fromstring(r.text)
stats = tree.xpath('//[@id="searchform"]/div/div/small/text()')

Возвращает пустой список.

Я скопировал xPath прямо со страницы элементов.
В качестве альтернативы я попробовал использовать Красивый суп:

html = r.text
soup = BeautifulSoup(html, 'xml')
stats = soup.find('small', {'class': 'pull-right'}).text

, который возвращает ошибку атрибута: объект NoneType не имеет текста атрибута.

Когда я проверил источник html, я понял, что на самом деле не могу найти искомый элемент (количество результатов) в источнике.

Кто-нибудь знает, почему это происходит и как это можно решить? Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Я могу получить это с помощью комбинации селекторов css small.pull-right для нацеливания на тег и имя класса элемента.

from bs4 import BeautifulSoup
import requests
url = 'https://www.exalead.com/search/web/results/?q=lead+poisoning'
res = requests.get(url)
soup = BeautifulSoup(res.content, "lxml")
print(soup.select_one('small.pull-right').text)
0 голосов
/ 15 ноября 2018

Когда я проверил источник html, я понял, что на самом деле не могу найти искомый элемент (количество результатов) в источнике.

Это говорит о том, что данные, которые вы ищете, динамически генерируются с помощью JavaScript. Вам нужно будет увидеть искомый элемент в html-источнике.

Чтобы подтвердить, что это является причиной вашей ошибки, вы можете попробовать что-то действительно простое, например:

html = r.text
soup = BeautifulSoup(html, 'lxml')

* обратите внимание на 'lxml' выше.

А затем вручную проверьте «суп», чтобы увидеть, есть ли нужный элемент.

...