python xpath возвращает пустой список

Я новичок в работе с 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 прямо со страницы элементов.
В качестве альтернативы я попытался использовать Beautiful Soup:

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

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

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

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


person Elisa Macchi    schedule 14.11.2018    source источник
comment
вы пробовали xpath без /text() ? Затем получите innerHTML   -  person Ywapom    schedule 15.11.2018


Ответы (2)


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

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

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

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

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

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

person Matthew5Johnson    schedule 14.11.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)
person QHarr    schedule 14.11.2018
comment
Пожалуйста, не забудьте поставить галочку рядом с ответом, чтобы проверить решение. stackoverflow.com/help/someone-answers - person QHarr; 15.11.2018