BeautifulSoup — парсеры lxml и html5lib, очищающие различияPython

Программы на Python
Ответить
Anonymous
 BeautifulSoup — парсеры lxml и html5lib, очищающие различия

Сообщение Anonymous »

Я использую BeautifulSoup 4 с Python 2.7. Я хотел бы извлечь определенные элементы с веб-сайта (количества, см. пример ниже). По какой-то причине парсер lxml не позволяет мне извлечь со страницы все нужные элементы. Он будет печатать только первые три элемента. Я пытаюсь использовать анализатор html5lib, чтобы проверить, смогу ли я извлечь их все.

На странице содержится несколько элементов с указанием их цены и количества. Часть кода, содержащая нужную информацию для каждого элемента, выглядит следующим образом:


453 grams
$619.06 $523.91




Давайте рассмотрим следующие три случая:

СЛУЧАЙ 1 — ДАННЫЕ:< /p>

#! /usr/bin/python
from bs4 import BeautifulSoup
data = """

453 grams
$619.06 $523.91

"""
soup = BeautifulSoup(data)
print soup.td.span.text


Печать:

453 grams


СЛУЧАЙ 2 — LXML:

#! /usr/bin/python
from bs4 import BeautifulSoup
from urllib import urlopen
webpage = urlopen('The URL goes here')
soup=BeautifulSoup(webpage, "lxml")
print soup.find('td', {'class': 'size-price'}).span.text


Печать:

453 grams


СЛУЧАЙ 3 — HTML5LIB:

#! /usr/bin/python
from bs4 import BeautifulSoup
from urllib import urlopen
webpage = urlopen('The URL goes here')
soup=BeautifulSoup(webpage, "html5lib")
print soup.find('td', {'class': 'size-price'}).span.text


Я получаю следующую ошибку:

Traceback (most recent call last):
File "C:\Users\Dom\Python-Code\src\Testing-Code.py", line 6, in
print soup.find('td', {'class': 'size-price'}).span.text
AttributeError: 'NoneType' object has no attribute 'span'


Как мне адаптировать свой код, чтобы извлечь нужную информацию с помощью парсера html5lib? Я могу увидеть всю нужную информацию, если просто распечатаю суп в консоли после использования html5lib, поэтому я решил, что это позволит мне получить то, что я хочу. Это не относится к парсеру lxml, поэтому мне также интересно узнать, что парсер lxml, похоже, не извлекает все количества с помощью парсера lxml, если я использую:

print [td.span.text for td in soup.find_all('td', {'class': 'size-price'})]


Подробнее здесь: https://stackoverflow.com/questions/226 ... ifferences
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»