Анализ HTML с использованием Python
Я ищу модуль Parser 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 Inspect element (просмотреть HTML), вы бы знали, что она дает вам все теги в хорошем вложенном виде, как дерево.
Я бы предпочел встроенный модуль, но это может потребовать слишком многого.
Я просмотрел множество вопросов о переполнении стека и нескольких блогах в Интернете, и большинство из них предлагают BeautifulSoup или lxml или HTMLParser, но некоторые из них подробно описывают функциональность и просто заканчиваются как дискуссия, по которой быстрее и быстрее ЭФФЕКТИВНАЯ.
Ответы
Ответ 1
Итак, я могу в принципе попросить его получить содержимое/текст в теге div с контейнером class=, содержащимся в теге 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()
И он использует те же селекторы, что и элемент проверки Firefox или Chrome. Например:
![the element selector is '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 Документация
Ответ 5
Я рекомендую lxml для разбора HTML. См. "Анализ HTML" (на сайте lxml).
По моему опыту Beautiful Soup испортил какой-то сложный HTML. Я считаю, что это потому, что Beautiful Soup не является синтаксическим анализатором, а очень хорошим анализатором строк.
Ответ 6
Я рекомендую использовать библиотеку justext:
https://github.com/miso-belica/jusText
Использование:
python2:
import requests
import justext
response = requests.get("http://planet.python.org/")
paragraphs = justext.justext(response.content, justext.get_stoplist("English"))
for paragraph in paragraphs:
print paragraph.text
Python3:
import requests
import justext
response = requests.get("http://bbc.com/")
paragraphs = justext.justext(response.content, justext.get_stoplist("English"))
for paragraph in paragraphs:
print (paragraph.text)
Ответ 7
Я бы использовал EHP
https://github.com/iogf/ehp
Вот он:
from ehp import *
doc = '''<html>
<head>Heading</head>
<body attr1='val1'>
<div class='container'>
<div id='class'>Something here</div>
<div>Something else</div>
</div>
</body>
</html>
'''
html = Html()
dom = html.feed(doc)
for ind in dom.find('div', ('class', 'container')):
print ind.text()
Вывод:
Something here
Something else