python BeautifulSoup ищет тег - PullRequest
       7

python BeautifulSoup ищет тег

6 голосов
/ 30 марта 2012

Мой первый пост здесь, я пытаюсь найти все теги в этом конкретном HTML, и я не могу их получить, это код:

from bs4 import BeautifulSoup
from urllib import urlopen

url = "http://www.jutarnji.hr"
html_doc = urlopen(url).read()
soup = BeautifulSoup(html_doc)
soup.prettify()
soup.find_all("a", {"class":"black"})

функция поиска возвращает [], ноя вижу, что есть теги с классом: "черный" в HTML, я что-то пропустил?

Спасибо, Ведран

Ответы [ 4 ]

2 голосов
/ 31 марта 2012

У меня тоже была такая же проблема.

Попробуйте

soup.findAll("a",{"class":"black"})

вместо

soup.find_all("a",{"class":"black"})

soup.findAll () хорошо работает для меня.

1 голос
/ 30 марта 2012

Проблема в том, что теги класса веб-сайта не отделены от конца значения атрибута href пробелом. BeautifulSoup, похоже, не справляется с этим очень хорошо. Воспроизводимый контрольный пример:

>>> BeautifulSoup.BeautifulSoup('<a href="http://www.jutarnji.hr/crkva-se-ogradila-od--cjenika--don-mikica--osim-krizme--sve-druge-financijske-obveze-su-neprihvatljive/1018314/" class="black">').prettify()
'<a href="http://www.jutarnji.hr/crkva-se-ogradila-od--cjenika--don-mikica--osim-krizme--sve-druge-financijske-obveze-su-neprihvatljive/1018314/" class="black">\n</a>'
>>> BeautifulSoup.BeautifulSoup('<a href="http://www.jutarnji.hr/crkva-se-ogradila-od--cjenika--don-mikica--osim-krizme--sve-druge-financijske-obveze-su-neprihvatljive/1018314/"class="black">').prettify()
''
1 голос
/ 30 марта 2012

Кажется, это работает для меня, поэтому я бы сказал, что проблема в вашем HTML-документе.

Я попытался запустить следующее:

from bs4 import BeautifulSoup

html_doc = """<html>
 <body>
  <a class="black">
   <b>
    text1
   </b>
   <c>
    text2
   </c>
  </a>
  <a class="micio">
  </a>
  <a class="black">
  </a>
 </body>
</html>"""
soup = BeautifulSoup(html_doc)
soup.prettify()
print(soup.find_all("a", {"class":"black"}))

И в качестве вывода яполучил:

[<a class="black">
<b>
    text1
   </b>
<c>
    text2
   </c>
</a>, <a class="black">
</a>]

Редактировать: Как указал @ Puneet , проблема может заключаться в отсутствии пробела между атрибутами вhtml вы извлекаете.

Я пытался, например, изменить приведенный выше пример на что-то вроде:

html_doc = """<html>
 <body>
  <aclass="black">

# etc.. as before

И в результате я получил пустой список: [].

0 голосов
/ 31 марта 2012

кажется, что использование lxml решает проблему:

from bs4 import BeautifulSoup
import lxml
from urllib import urlopen

url = "http://www.jutarnji.hr"
html_doc = urlopen(url).read()
soup = BeautifulSoup(html_doc, "lxml")
soup.prettify()

soup.find_all("a", {"class":"black"})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...