Как я могу перевести это выражение XPath в BeautifulSoup?

Вот то, как сделать это с # и операторами % в Bash.

$ x="/foo/fizzbuzz.bar"
$ y=${x%.bar}
$ echo ${y##*/}
fizzbuzz

${x%.bar} мог также быть ${x%.*} для удаления всего после точки или ${x%%.*} для удаления всего после первой точки.

Пример:

$ x="/foo/fizzbuzz.bar.quux"
$ y=${x%.*}
$ echo $y
/foo/fizzbuzz.bar
$ y=${x%%.*}
$ echo $y
/foo/fizzbuzz

Документация может быть найдена в руководство Bash. Ищите ${parameter%word} и ${parameter%%word} запаздывающий раздел соответствия части.

10
задан Community 23 May 2017 в 12:34
поделиться

4 ответа

I know BeautifulSoup is the canonical HTML parsing module, but sometimes you just want to scrape out some substrings from some HTML, and pyparsing has some useful methods to do this. Using this code:

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

I extracted 914 references from your page, from Abel to Zupikova.

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
4
ответ дан 3 December 2019 в 23:50
поделиться

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

Изменить:
попробуйте (непроверено) протестировано:

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

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

import BeautifulSoup
soup = BeautifulSoup.BeautifulSoup(html_string)
6
ответ дан 3 December 2019 в 23:50
поделиться

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

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

2
ответ дан 3 December 2019 в 23:50
поделиться

Похоже, вы используете 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-коде есть искаженный тег, но я не заметил, что это было на первый взгляд.

1
ответ дан 3 December 2019 в 23:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: