2016-10-10 2 views
0

Я использую beautifulsoup, чтобы найти все p на определенной странице html, которую я сохранил локально. Моего кодаbeautifulsoup не находит всех p с определенным классом

with open ("./" + str(filename) + ".txt", "r") as myfile: 
    data=myfile.read().replace('\n', '') 
soup = BeautifulSoup(data) 
t11 = soup.findAll("p", {"class": "commentsParagraph"}) 

это коды работ для части страницы, но какая-то часть страницы загружаются с помощью AJAX (который я предварительно, прежде чем я спас источник), а код не работает на нем.

, чтобы проверить это, я добавил к одному из p тегов в АЯКС части класса commentsParagraph2 и изменил код для

t11 = soup.findAll("p", {"class": "commentsParagraph2"}) 

но t11 является пустым списком.

Я прилагаю файл подкачки, а также here

Есть идеи?

+0

Я предполагаю, что материал Ajax, который вы предварительно загружаете, не рассматривается beautifulsoup как частью DOM. –

ответ

1

Существует один р тег с классом commentsParagraph2 в вашем HTML, который BS4 можно найти без проблем с использованием всех тремя парсеров:

In [8]: from bs4 import BeautifulSoup 
    ...: soup1 = BeautifulSoup(open("/home/padraic 
    ...: /t.html").read(),"html5lib") 
    ...: soup2 = BeautifulSoup(open("/home/padraic 
    ...: /t.html"),"html.parser") 
    ...: soup3 = BeautifulSoup(open("/home/padraic 
    ...: /t.html"),"lxml") 
    ...: print(soup1.select_one("p.commentsParagraph2")) 
    ...: print(soup2.select_one("p.commentsParagraph2")) 
    ...: print(soup3.select_one("p.commentsParagraph2")) 
    ...: 
<p class="commentsParagraph2"> 
So much better than Ryder. Only take Econ 11 if she's one of the professors teaching it. Beware her tests though, which are much different from Ryder's. 
</p> 
<p class="commentsParagraph2"> 
So much better than Ryder. Only take Econ 11 if she's one of the professors teaching it. Beware her tests though, which are much different from Ryder's. 
</p> 
<p class="commentsParagraph2"> 
So much better than Ryder. Only take Econ 11 if she's one of the professors teaching it. Beware her tests though, which are much different from Ryder's. 
</p> 

Так что либо вы используете сломанные и больше не поддерживается BeautifulSoup3 или более старую версию BS4.

+0

Я использую от bs4 import BeautifulSoup как я могу проверить версию? – Quantico

+0

'import bs4; bs4 .__ version__' –

+0

какая версия вы используете? – Quantico

-1

Я скачал вам html и провел несколько тестов, модуль beautifulsoup смог узнать только три p-узла. И я думаю, это потому, что в html есть некоторые iframe, поэтому BS не работает. Мое предложение использует re модуля вместо bs

образца коды для справки:

import re 

with open('1.html', 'r') as f: 
    data = f.read() 
    m=re.findall(r'(?<=<p class="commentsParagraph">)[\!\w\s.\'\,\-\(\)\@\#\$\%\^\&\*\+\=\/|\^<]+(?=</p>)', data) 
    print(m) 
Смежные вопросы