Как я могу перевести это выражение XPath в BeautifulSoup? - PullRequest
10 голосов
/ 29 ноября 2009

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

hxs.select('//td[@class="altRow"][2]/a/@href').re('/.a\w+')

Вышеупомянутое выражение от Scrapy . Я пытаюсь применить регулярное выражение re('\.a\w+') к td class altRow, чтобы получить ссылки оттуда.

Буду также признателен за ссылки на любые другие учебные пособия или документацию. Я не смог найти ни одного.

Спасибо за вашу помощь.

Edit: Я смотрю на эту страницу :

>>> soup.head.title
<title>White & Case LLP - Lawyers</title>
>>> soup.find(href=re.compile("/cabel"))
>>> soup.find(href=re.compile("/diversity"))
<a href="/diversity/committee">Committee</a> 

Тем не менее, если вы посмотрите на страницу источника "/cabel" есть:

 <td class="altRow" valign="middle" width="34%"> 
 <a href='/cabel'>Abel, Christian</a> 

По какой-то причине результаты поиска не видны BeautifulSoup, но они видны XPath, потому что hxs.select('//td[@class="altRow"][2]/a/@href').re('/.a\w+') перехватывает "/ cabel"

Edit: коббал: это все еще не работает. Но когда я ищу это:

>>>soup.findAll(href=re.compile(r'/.a\w+'))
[<link href="/FCWSite/Include/styles/main.css" rel="stylesheet" type="text/css" />, <link rel="shortcut icon" type="image/ico" href="/FCWSite/Include/main_favicon.ico" />, <a href="/careers/northamerica">North America</a>, <a href="/careers/middleeastafrica">Middle East Africa</a>, <a href="/careers/europe">Europe</a>, <a href="/careers/latinamerica">Latin America</a>, <a href="/careers/asia">Asia</a>, <a href="/diversity/manager">Diversity Director</a>]
>>>

возвращает все ссылки со вторым символом «а», но не имена адвокатов. Так что по какой-то причине эти ссылки (такие как "/ cabel") не видны для BeautifulSoup. Я не понимаю почему.

Ответы [ 4 ]

6 голосов
/ 29 ноября 2009

один вариант - использовать lxml (я не знаком с beautifulsoup, поэтому не могу сказать, как с ним работать), он по умолчанию поддерживает XPath

Edit:
попробуйте (не проверено) проверено:

soup.findAll('td', 'altRow')[1].findAll('a', href=re.compile(r'/.a\w+'), recursive=False)

Я использовал документы на http://www.crummy.com/software/BeautifulSoup/documentation.html

суп должен быть объектом BeautifulSoup

import BeautifulSoup
soup = BeautifulSoup.BeautifulSoup(html_string)
4 голосов
/ 30 ноября 2009

Я знаю, что BeautifulSoup является каноническим модулем парсинга HTML, но иногда вам просто нужно вычистить некоторые подстроки из некоторого HTML, и у pyparsing есть несколько полезных методов для этого. Используя этот код:

from pyparsing import makeHTMLTags, withAttribute, SkipTo
import urllib

# get the HTML from your URL
url = "http://www.whitecase.com/Attorneys/List.aspx?LastName=&FirstName="
page = urllib.urlopen(url)
html = page.read()
page.close()

# define opening and closing tag expressions for <td> and <a> tags
# (makeHTMLTags also comprehends tag variations, including attributes, 
# upper/lower case, etc.)
tdStart,tdEnd = makeHTMLTags("td")
aStart,aEnd = makeHTMLTags("a")

# only interested in tdStarts if they have "class=altRow" attribute
tdStart.setParseAction(withAttribute(("class","altRow")))

# compose total matching pattern (add trailing tdStart to filter out 
# extraneous <td> matches)
patt = tdStart + aStart("a") + SkipTo(aEnd)("text") + aEnd + tdEnd + tdStart

# scan input HTML source for matching refs, and print out the text and 
# href values
for ref,s,e in patt.scanString(html):
    print ref.text, ref.a.href

Я извлек 914 ссылок с вашей страницы, от Авеля до Зупикова.

Abel, Christian /cabel
Acevedo, Linda Jeannine /jacevedo
Acuña, Jennifer /jacuna
Adeyemi, Ike /igbadegesin
Adler, Avraham /aadler
...
Zhu, Jie /jzhu
Zídek, Aleš /azidek
Ziółek, Agnieszka /aziolek
Zitter, Adam /azitter
Zupikova, Jana /jzupikova
2 голосов
/ 29 ноября 2009

Я только что ответил на это в списке рассылки Beautiful Soup в ответ на письмо Зейнел в список. По сути, на веб-странице есть ошибка, которая полностью убивает Beautiful Soup 3.1 во время синтаксического анализа, но просто искажена Beautiful Soup 3.0.

Тема находится в архиве групп Google .

1 голос
/ 29 ноября 2009

Похоже, что вы используете BeautifulSoup 3.1

Я предлагаю вернуться к BeautifulSoup 3.0.7 (из-за эта проблема )

Я только что протестировал с 3.0.7 и получил ожидаемые результаты:

>>> soup.findAll(href=re.compile(r'/cabel'))
[<a href="/cabel">Abel, Christian</a>]

Тестирование с BeautifulSoup 3.1 дает результаты, которые вы видите. Вероятно, в html есть неправильно сформированный тег, но я не увидел, что это был быстрый взгляд.

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