1

lxml/BeautifulSoup の使用方法を学んでいますが、これをできるだけ便利にするにはどうすればよいか疑問に思っていました。ソースには、本体の次の構造があります。

<p class = "info">
    <!-- a bunch of other tags and text in each paragraph class -->
</p>
<p class = "filler1">
</p>
<p class = "filler2">
</p>
<p class = "filler2">
</p>
<p class = "repeat">
</p>
<p class = "repeat">
</p>
<p class = "descr">
</p>
<p class = "descr">
</p>
<p class = "descr">
</p>

現時点では、私は単に使用しています

soup = BeautifulSoup(open('savedPage.html'))
soup.body(text=True)

本文のすべてのテキストをスクレイピングします。1) "filler2" の後の段落クラスにあるすべてのテキストをスクレイピングし、2) エスケープ シーケンスを回避するための迅速で便利な方法があるかどうか疑問に思っていました。

2)に関しては、次のように繰り返すことで、この問題を回避できることを知っています

for i in range(1,len(soup.body(text=True))+1):
    soup.body(text=True)[i]

これにより、すべてのエスケープ シーケンスが解釈されます。ただし、1) の場合、「filler2」クラスの後にすべてのテキストをスクレイピングして、コードをシンプルに保つ方法はありますか? ツリー全体をトラバースしたり、正規表現を作成したりしたくありません。

4

1 に答える 1

0

あなたはこのようなことを試すことができます-あなたが本文からほとんどのテキストを取得しようとしていると仮定します。

data = urllib2.urlopen(link)
content = data.read()
# replace the script and style tags with html comments, so the bs4 just skips them
content = content.replace("<script", "<!--")
content = content.replace("</script>", "-->")
content = content.replace("<style", "<!--")
content = content.replace("</style>", "-->")
soup = BeautifulSoup(content, "lxml") # assuming you've imported lxml and bs4
comments = soup.findAll(text=lambda text:isinstance(text, Comment))
Comments = [comment.extract() for comment in comments] # remove the commenys
words = []
for i in soup.stripped_strings:
    print i
# i will print most of the text of the page line by line

まあ、このアプローチは最もクリーンなものではありません。しかし、それはうまくいくはずです。

于 2012-11-18T07:52:41.263 に答える