10

前の質問に答えて、何人かの人々は私が私のプロジェクトにBeautifulSoupを使うことを提案しました。私は彼らのドキュメントに苦労していて、それを解析することはできません。この式をBeautifulSoup式に変換できるはずのセクションを誰かに教えてもらえますか?

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

上記の式はScrapyからのものです。そこからリンクを取得するために正規表現re('\.a\w+')を適用しようとしています。td class altRow

他のチュートリアルやドキュメントへのポインタもいただければ幸いです。何も見つかりませんでした。

ご協力いただきありがとうございます。

編集: 私はこのページを見ています:

>>> 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には表示されませんが、hxs.select('//td[@class="altRow"][2]/a/@href').re('/.a\w+')「/ cabel」をキャッチするため、XPathには表示されます。

編集: cobbal:それはまだ機能していません。しかし、私がこれを検索すると:

>>>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>]
>>>

2番目の文字「a」を含むすべてのリンクを返しますが、弁護士名は返しません。したがって、何らかの理由で、これらのリンク( "/ cabel"など)はBeautifulSoupに表示されません。理由がわかりません。

4

4 に答える 4

6

1つのオプションは、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でドキュメントを使用しました

スープはBeautifulSoupオブジェクトである必要があります

import BeautifulSoup
soup = BeautifulSoup.BeautifulSoup(html_string)
于 2009-11-29T05:41:58.283 に答える
4

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

Abel から Zupikova まで、あなたのページから 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
于 2009-11-29T21:20:40.340 に答える
2

Beautiful Soupメーリングリストで、リストへのZeynelの電子メールへの応答として、これに返信しました. 基本的に、Web ページには、解析中に Beautiful Soup 3.1 を完全に停止させるエラーがありますが、Beautiful Soup 3.0 によって単に破壊されているだけです。

スレッドはGoogle グループのアーカイブにあります。

于 2009-11-29T20:16:04.787 に答える
1

BeautifulSoup3.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に不正な形式のタグがありますが、それが何であるかを簡単に確認できませんでした。

于 2009-11-29T17:48:20.243 に答える