0

私はこの小さなクラスを持っています:

class HTMLTagStripper(HTMLParser):
    def __init__(self):
       self.reset()
       self.fed = []
    def handle_data(self, data):
       self.fed.append(data)
    def handle_starttag(self, tag, attrs):
       if tag == 'a':
           return attrs[0][1]
    def get_data(self):
       return ''.join(self.fed)

この HTML コードの解析:

<div id="footer">
<p>long text.</p>
<p>click <a href="somelink.com">here</a>
</div>

これは私が得る結果です:long text click here
しかし、私は取得したい:long text click somelink.com

これを行う方法はありますか?

4

4 に答える 4

8

BeautifulSoupをご覧ください。

または、正規表現/文字列操作を使用して、必要なデータを取り除くことができます。長い目で見れば、BeautifulSoup のようなものを使用することは、特にこれ以上のことを期待している場合に効果があります。

BeautifulSoup を使用して HTML データ内の単一/唯一のリンクを抽出する 1 つの方法を次に示します (私はこれの専門家ではないため、他のより良い方法があるかもしれません - 提案/修正を歓迎します)。

from BeautifulSoup import BeautifulSoup
s = """<div id="footer">
       <p>long text.</p>
       <p>click <a href="somelink.com">here</a>
       </div>"""

soup = BeautifulSoup(s)
your_link = soup.find('a', href=True)['href']
print 'long text click', your_link

印刷されます:

long text click somelink.com

于 2012-06-19T13:27:00.633 に答える
0

私は実際にこの新しいhtmlパーサーライブラリをチェックして、この解決策を考え出しました:

from htmldom import htmldom
dom = htmldom.HtmlDom().createDom( """<div id="footer">
<p>long text.</p>
<p>click <a href="somelink.com">here</a>
</div>""");
nodes = dom.find( "p" ).children( all_children = True ) # this makes all text nodes to be in the set.
for node in nodes:
    if node._is( "a" ):
        print( node.attr( "href" ).strip() )
    elif node._is( "text" ):
        print( node.getNode().text, end = '', sep = ' ' )

ライブラリはSourceforgeまたはpythonパッケージインデックスからダウンロードできます: HtmlDom、python 3.xで動作します。ライブラリのドキュメントはそれほど良くありませんが、理解できます。あなたが答えを気に入ってくれることを願っています:)

于 2012-07-19T03:45:05.310 に答える
0

これを置き換える:

def handle_starttag(self, tag, attrs):
   if tag == 'a':
       return attrs[0][1]

これとともに:

def handle_starttag(self, tag, attrs):
   if tag == 'a':
       value = dict(attrs).get("href", None)
       if value:
           # add extra spaces since you dont sanitize
           # them in get_data
           self.fed.append(" %s " % value)

うまくいくはずです。htmlソースコードに応じて、またはそうではありません。だからこそ、BeatfulSoup があります。

于 2012-06-19T14:28:05.237 に答える
0

これはうまくいきません:

x = re.compile(r'<.*?>')
stripped = x.sub('', html)

html タグからいくつかのプロパティ (href など) も抽出したいためです。

Levon が指摘するように、BeautifulSoup を選ぶべきです。

于 2012-06-19T13:28:54.363 に答える