2014-02-18 2 views
0

, пожалуйста, помогите исправить сценарий.Как получить второй подэлемент?

import urllib.request 
import urllib.parse 
import re 

import requests 
import bs4 

beginIndex = 1000 
endIndex = 1010 
prefix = "http://www.inpic.ru" 

for i in range(beginIndex, endIndex): 
    req = requests.get(prefix + '/image/' + str(i)) 
    if req.status_code == requests.codes.ok: 
     print(i, '\t', req.status_code, '\t', req, end='\n') 
     soup = bs4.BeautifulSoup(req.content) 
     #print(soup.prettify()) 
     name = soup.find("td", {"class": "post_title"}).contents[1].contents 
     author = soup.find("td", {"class": "post_title"}).contents[2].contents[1].contents 
     #name = replace(name, '/', '_') 
     print(name, '\t', author)  

сообщение об ошибке:

Traceback (most recent call last): File 
"C:\VINT\OPENSERVER\OpenServer\domains\localhost\python\parse_html\1\q.py", 
line 19, in <module> 
    author = soup.find("td", {"class": "post_title"}).contents[2].contents[1].contents File 
"C:\Python33\lib\site-packages\bs4\element.py", line 675, in 
__getattr__ 
    self.__class__.__name__, attr)) AttributeError: 'NavigableString' object has no attribute 'contents' 

проблема заключается в том, что невозможно перечислить содержимое элемента с классом «date_author». Мне нужно использовать только команду "содержимое" (НЕ NextSibling и т.д.)

+0

Почему вы не можете использовать 'next_sibling' или подобное? – Birei

+2

Я просто подключил '' http: // www.inpic.ru/image/1010'' и пропустил его через bs4 и 'soup.find (" td ", {" class ":" post_title "}). [2] '- это просто строковый литерал' '\ n''. Вам нужно переосмыслить свою стратегию разбора. Я не знаю, почему вы * только * должны использовать содержимое, но это хрупкая стратегия. Подумайте об использовании операций 'select' или clained' find', как минимум. – roippi

ответ

1

Использование

soup.find("td", {"class": "post_title"}).contents[1].string 

в soup.find("td", {"class": "post_title"}).contents[1] является NavigableString.

Смежные вопросы