このXPath式をBeautifulSoupに変換するにはどうすればよいですか?
-
06-07-2019 - |
質問
前の質問、何人かは BeautifulSoup を使用することを提案しました私のプロジェクトのために。私は彼らのドキュメントに苦労してきましたが、それを解析することはできません。誰かがこの式をBeautifulSoup式に変換できるセクションに私を向けることができますか?
hxs.select('//td[@class="altRow"][2]/a/@href').re('/.a\w+')
上記の式は Scrapy からのものです。正規表現 re( '\。a \ w +')
を tdクラス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>
まだ、ページソース&quot; / cabel&quot;
を見ると、
<td class="altRow" valign="middle" width="34%">
<a href='/cabel'>Abel, Christian</a>
何らかの理由で、検索結果はBeautifulSoupには表示されませんが、 hxs.select( '// td [@ class =&quot; altRow&quot;] [2] / a / @ hrefによりXPathには表示されます。 ').re(' /。a \ w + ')
キャッチ&quot; / cabel&quot;
編集: 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」ですべてのリンクを返します;しかし、弁護士の名前ではありません。そのため、何らかの理由でこれらのリンク(&quot; / cabel&quot;など)はBeautifulSoupに表示されません。理由がわかりません。
解決
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
他のヒント
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
soupはBeautifulSoupオブジェクトでなければなりません
import BeautifulSoup
soup = BeautifulSoup.BeautifulSoup(html_string)
Beautiful Soupメーリングリストで、リストへのZeynelの電子メールへの応答としてこれに回答しました。基本的に、Webページにエラーがあり、解析中にBeautiful Soup 3.1を完全に強制終了しますが、Beautiful Soup 3.0によって破壊されます。
スレッドは Googleグループアーカイブにあります。
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に不正なタグがありますが、クイックルックでその内容がわかりませんでした。