匹配两个标签之间的所有文字?有了beautifulsoup4,还是有更好的答案?

时间:2017-02-19 23:38:50

标签: python beautifulsoup screen-scraping

我试图匹配的HTML是这样的......

...
<!-- Start Body -->
Paragraph 1<br><br>
Paragraph 2<br><br>
<!-- End Body -->
...

我抓的网站很旧,所以从页面到页面,它可以从br更改为段落标签等。这是一个混乱,唯一可靠的是所有内容我需要的是在开始正文和结束正文评论标签之间。

最好的方法是什么?我是应该使用beautifulsoup还是矫枉过正?

2 个答案:

答案 0 :(得分:1)

我只是直接抓取文字,没有BeautifulSoup:

start = "<!-- Start Body -->"
end = "<!-- End Body -->"
html = "..." # Page HTML

_s = html.find(start)
_e = html.find(end)
if _s != -1 and _e != -1:
  found = html[_s + len(start):_e]

在最后一行可能有一个off-by,但这应该让你开始。如果标签出现多次,您还需要决定该怎么做。

答案 1 :(得分:0)

您可以使用str.split

>>> html = '''
... ...
... <!-- Start Body -->
... Paragraph 1<br><br>
... Paragraph 2<br><br>
... <!-- End Body -->
... ...
... '''
>>> chunk = html.split('<!-- Start Body -->')[1].split('<!-- End Body -->')[0]
>>> print(chunk)

Paragraph 1<br><br>
Paragraph 2<br><br>
  • html.split('<!-- Start Body -->')[1] - 在Start Body评论
  • 之后获得参与
  • .split('<!-- End Body -->')[0] - 在End Body评论
  • 之前获得参与

使用re.findall替代方案:

>>> import re
>>> re.findall('<!-- Start Body -->(.+?)<!-- End Body -->', html, flags=re.S)
['\nParagraph 1<br><br>\nParagraph 2<br><br>\n']