Подтвердить что ты не робот

Анализ 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, но некоторые из них подробно описывают функциональность и просто заканчиваются как дискуссия, по которой быстрее и быстрее ЭФФЕКТИВНАЯ.

4b9b3361

Ответ 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