Вопрос-Ответ

Parsing HTML using Python

Синтаксический анализ HTML с помощью Python

Я ищу модуль синтаксического анализа HTML для Python, который может помочь мне получить теги в виде списков / словарей / объектов Python.

Если у меня есть документ вида:

<html>
<head>Heading</head>
<body attr1='val1'>
<div class='container'>
<div id='class'>Something here</div>
<div>Something else</div>
</div>
</body>
</html>

тогда это должно дать мне способ доступа к вложенным тегам через имя или идентификатор HTML-тега, чтобы я мог в принципе попросить его предоставить мне содержимое / текст в div теге с class='container' содержимым внутри body тега, или что-то подобное.

Если вы использовали функцию "Проверять элемент" в Firefox (просмотр HTML), вы бы знали, что она предоставляет вам все теги в удобном вложенном виде, как дерево.

Я бы предпочел встроенный модуль, но это может потребовать слишком многого.


Я просмотрел множество вопросов о Stack Overflow и несколько блогов в Интернете, и большинство из них предлагают BeautifulSoup, или lxml, или HTMLParser, но лишь немногие из них подробно описывают функциональность и просто заканчиваются спорами о том, какой из них быстрее / эффективнее.

Переведено автоматически
Ответ 1

Чтобы я мог попросить его предоставить мне содержимое / текст в теге div с class ='container', содержащемся в теге body , или что-то подобное.


try: 
from BeautifulSoup import BeautifulSoup
except ImportError:
from bs4 import BeautifulSoup
html = #the HTML code you've written above
parsed_html = BeautifulSoup(html)
print(parsed_html.body.find('div', attrs={'class':'container'}).text)

Я думаю, вам не нужны описания производительности - просто прочитайте, как работает BeautifulSoup. Посмотрите на его официальную документацию.

Ответ 2

Я предполагаю, что вы ищете pyquery:


pyquery: библиотека, подобная jquery, для python.


Пример того, что вы хотите, может быть следующим:

from pyquery import PyQuery    
html = # Your HTML CODE
pq = PyQuery(html)
tag = pq('div#id') # or tag = pq('div.class')
print tag.text()

И он использует те же селекторы, что и элемент inspect в Firefox или Chrome. Например:

селектором элемента является 'div # mw-head.noprint'

Проверяемый селектор элемента 'div # mw-head.noprint' . Итак, в pyquery вам просто нужно передать этот селектор:

pq('div#mw-head.noprint')
Ответ 3

Здесь вы можете прочитать больше о различных анализаторах HTML на Python и их производительности. Несмотря на то, что статья немного устарела, она все равно дает вам хороший обзор.

Производительность синтаксического анализа HTML на Python

Я бы порекомендовал BeautifulSoup, даже если он не встроен. Просто потому, что с ним так легко работать для таких задач. Например:

import urllib2
from BeautifulSoup import BeautifulSoup

page = urllib2.urlopen('http://www.google.com/')
soup = BeautifulSoup(page)

x = soup.body.find('div', attrs={'class' : 'container'}).text
Ответ 4

По сравнению с другими библиотеками синтаксического анализа lxml выполняется чрезвычайно быстро:

И с cssselect его довольно просто использовать и для очистки HTML-страниц:

from lxml.html import parse
doc = parse('http://www.google.com').getroot()
for div in doc.cssselect('a'):
print '%s: %s' % (div.text_content(), div.get('href'))

lxml.html Документация

python