L XML xpath не обнаруживает в «грязном» файле html, однако после отступа и очистки он завершается успешно - PullRequest
0 голосов
/ 05 марта 2020

Буду очень признателен за любую помощь. Я создаю парсер для веб-сайта. Я пытаюсь определить элемент, используя пакет l xml, элемент имеет довольно простой относительный xpath: '//div[@id="productDescription"]'. Когда я вручную захожу на веб-страницу, делаю «просмотр исходной страницы» и копирую строку html в локальный файл html, все работает отлично. Однако, если я загружаю файл автоматически:

headers = {"user-Agent": "MY SCRAPER USER-AGENT", "Accept-Encoding":"gzip, deflate", "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "DNT": "1","Connection": "close", "Upgrade-Insecure-Requests": "1"}
product_HTML_bytes = requests.get(product_link, headers=headers, proxies={'http': "***:***"}).content
product_HTML_str = product_HTML_bytes.decode()
main_data = html.fromstring(product_HTML_str)
product_description_tags = main_data.xpath('//div[@id="productDescription"]')
...

, я ничего не получаю (и данные в файле существуют). Я также попытался сначала очистить образец страниц, используя тот же request.get с теми же заголовками и т. Д., Сохранив файлы локально, а затем очистив лишние пробелы и сделав отступ в документе вручную с помощью этого html форматера: https://www.freeformatter.com/html-formatter.html и затем бум, это снова работает. Однако я не мог понять, какие именно изменения в файлах, но я был почти уверен, что дополнительные пробелы и отступы не должны иметь значения.

Что мне здесь не хватает?

Заранее спасибо

Редактировать:

URL: https://www.amazon.com/Samsung-MicroSDXC-Adapter-MB-ME128GA-AM/dp/B06XWZWYVP потому что вставить его здесь невозможно, так как файл превышает ограничение длины, я загрузил их в Интернете.

Не работает HTML: https://easyupload.io/231pdd

Отступ, чистая и отформатированная HTML страница: https://easyupload.io/a9oiyh

1 Ответ

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

По какой-то странной причине кажется, что библиотека l xml искажает вывод текста requests.get(), когда вывод фильтруется методом lxml.html.fromstring(). Я понятия не имею, почему.

Целевые данные все еще там, без сомнения:

from bs4 import BeautifulSoup as bs
soup = bs(product_HTML_str,'lxml') #note that the lxml parser is used here!
for elem in soup.select_one('#productDescription p'):
    print(elem.strip())

Вывод:

Просто правильная карта. С потрясающей скоростью и надежностью, ... et c.

Лично я предпочитаю использовать xpath в методах селекторов l xml до find() и css, используемых BeautifulSoup, но на этот раз BeautifulSoup выигрывает ...

...