5

Pythonで美しいスープを使用しています。

URL の例を次に示します。

http://www.locationary.com/place/en/US/Ohio/Middletown/McDonald%27s-p1013254580.jsp

HTML にはたくさんのタグがあり、どれを見つけるかを指定できる唯一の方法は ID を使用することです。私が見つけたいのは電話番号だけです。タグは次のようになります。

<td class="dispTxt" id="value_xxx_c_1_f_8_a_134242498">5134231582</td> 

同じ Web サイトの別の URL にアクセスしたことがありますが、電話番号タグの ID がほぼ同じであることが毎回わかりました。常に同じままである部分は次のとおりです。

'value_xxx_c_1_f_8_a_'

ただし、その後の数字は常に変化します。Beautiful Soup に ID の一部を探して一致させ、他の部分を正規表現のように数字にする方法はありますか?

また、タグを取得したら、どうすれば正規表現を使用せずに電話番号を抽出できるのでしょうか? Beautiful Soup でそれができるかどうかはわかりませんが、おそらく正規表現よりも簡単でしょう。

4

4 に答える 4

4

正規表現を使用できます (この例はタグ名に一致します。要素の ID に一致するように調整する必要があります):

import re
for tag in soup.find_all(re.compile("^value_xxx_c_1_f_8_a_")):
    print(tag.name)
于 2012-08-12T17:16:48.147 に答える
2

ドキュメントを知る

http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html

soup.findAll(id=re.compile("para$"))
# [<p id="firstpara" align="center">This is paragraph <b>one</b>.</p>,
#  <p id="secondpara" align="blah">This is paragraph <b>two</b>.</p>]
于 2012-08-12T17:18:11.907 に答える
0

ここでCSSセレクターを使用して、属性値のプレフィックスを照合できます。

soup.select('div[id^="value_xxx_c_1_f_8_a_"]')

これは、文字列で始まる属性を<div>持つタグにのみ一致します。idvalue_xxx_c_1_f_8_a_

代わりに切り替える場合はlxml、XPath1.0式を使用して次を見つけることができます。

from lxml import etree
doc = etree.parse(openfile)
for elem in doc.xpath('//div[starts-with(@id, "value_xxx_c_1_f_8_a_")]'):
    print elem.text

lxml XPath式を使用すると、BeautifulSoup正規表現の一致を使用するよりも1桁速くなります。

于 2012-08-12T17:20:02.577 に答える
-1

電話番号を取得するには、.text属性を使用できます。

tag = soup.find("foo") 
phone_number = tag.text
于 2012-08-12T17:36:24.540 に答える