Красивый суп: получить содержимое подузлов - PullRequest
1 голос
/ 21 октября 2010

У меня есть следующий код Python:

def scrapeSite(urlToCheck):
    html = urllib2.urlopen(urlToCheck).read()
    from BeautifulSoup import BeautifulSoup
    soup = BeautifulSoup(html)
    tdtags = soup.findAll('td', { "class" : "c" })
    for t in tdtags:
            print t.encode('latin1')

Это вернет мне следующий HTML-код:

<td class="c">
<a href="more.asp">FOO</a>
</td>
<td class="c">
<a href="alotmore.asp">BAR</a>
</td>

Я хотел бы получить текст между a-Node (например, FOO или BAR), который будет t.contents.contents К сожалению, это не так просто работает :) У кого-нибудь есть идеи, как это решить?

Большое спасибо, любая помощь приветствуется!

Cheers, Джозеф

Ответы [ 2 ]

3 голосов
/ 21 октября 2010

В этом случае вы можете использовать t.contents[1].contents[0], чтобы получить FOO и BAR.

Дело в том, что содержимое возвращает список со всеми элементами (теги и NavigableStrings), если вы печатаете содержимое, вы можете увидеть, что это что-то вроде

[u'\n', <a href="more.asp">FOO</a>, u'\n']

Итак, чтобы перейти к фактическому тегу, вам необходим доступ к contents[1] (если у вас точно такое же содержимое, это может варьироваться в зависимости от исходного HTML), после того как вы найдете правильный индекс, который вы можете использовать contents[0] впоследствии, чтобы получить строку внутри тега.

Теперь, поскольку это зависит от точного содержимого источника HTML, оно очень хрупкое. Более общим и надежным решением было бы снова использовать find(), чтобы найти тег 'a', через t.find('a'), а затем использовать список содержимого для получения значений в нем t.find('a').contents[0] или просто t.find('a').contents, чтобы получить целое список.

1 голос
/ 21 октября 2010

В вашем конкретном примере могут быть полезны pyharsing makeHTMLTags, поскольку они допускают множество HTML-вариаций в HTML-тегах, но обеспечивают удобную структуру для результатов:

html = """
<td class="c"> 
<a href="more.asp">FOO</a> 
</td> 
<td class="c"> 
<a href="alotmore.asp">BAR</a> 
</td> 
<td class="d"> 
<a href="alotmore.asp">BAZZ</a> 
</td> 
"""

from pyparsing import *

td,tdEnd = makeHTMLTags("td")
a,aEnd = makeHTMLTags("a")
td.setParseAction(withAttribute(**{"class":"c"}))

pattern = td + a("anchor") + SkipTo(aEnd)("aBody") + aEnd + tdEnd

for t,_,_ in pattern.scanString(html):
    print t.aBody, '->', t.anchor.href

печать:

FOO -> more.asp
BAR -> alotmore.asp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...