【问题标题】:Can't grab some content using regex [duplicate]无法使用正则表达式获取某些内容 [重复]
【发布时间】:2018-12-28 13:28:56
【问题描述】:

我在python 中结合BeautifulSoup 编写了一些代码,以在br 标记中获得一些addresses。如果是关于单独使用BeautifulSoup 解析所需的文本,我可以使用.next_sibling 来完成此操作,如下所示。我的意图是结合BeautifulSoupre 抓取br 中的内容。

这是我目前的尝试:

import re
from bs4 import BeautifulSoup

content = """
<div class="store"">
<b>address</b><br>BLOCK ANG MO KIO AVE<br>
<b>address_one</b><br>BLOCK 407 ANG MO KIO AVE 10 #01-741<br>
<b>address_two</b><br>NO. 53 ANG MO KIO AVE 3 AMK HUB#B1-82<br>
</div>
"""
# soup = BeautifulSoup(content,"lxml")
# for addr in soup.find_all("b"):
#     print(addr.next_sibling.next_sibling)

soup = BeautifulSoup(content,"lxml")
for addr in soup.find_all(text=re.compile(r"<br>(.*?)</br>")):
    print(addr)  #It prints nothing, no error either

仅供参考,如果未注释,注释掉的部分将完美地工作。当我试图弄清楚 re 在这种情况下的用途时,如果有人向我提供帮助,我会非常高兴。

【问题讨论】:

  • 如您所见,text 只表示标签的内部文本,并没有“看到”br 标签,text 的使用方式不正确。此外,它只会获取在其内部文本中包含一些文本的整个节点,它不会从中提取任何子字符串。这将提取这些节点,因为它们将完全匹配:soup.find_all(text=re.compile(r"^[A-Z0-9#.-]+(?:\s+[-.#A-Z0-9]+)*$"))
  • 没有关闭 &lt;/br&gt; 标记。 br 只是一个换行符 - 它不应该有结束标签
  • 考虑提供它作为答案。您建议的方法非常有效@Wiktor Stribiżew。
  • @Wiktor Stribiżew,我无法理解在 $ 之前使用的 *。因为在非捕获组中已经有一个+
  • 量词影响组内的整个模式序列。否则,它将仅匹配 ABC DEF 字符串。使用*,它匹配ABCABC DEFA-C B.F H#D 字符串。

标签: python regex python-3.x web-scraping beautifulsoup


【解决方案1】:

如果你想使用正则表达式,你可以试试下面:

for addr in re.findall(r"<br>(.*?)<br>", content):
    print(addr)

输出是

BLOCK ANG MO KIO AVE
BLOCK 407 ANG MO KIO AVE 10 #01-741
NO. 53 ANG MO KIO AVE 3 AMK HUB#B1-82

【讨论】:

  • 你一定是想使用惰性版本,r"&lt;br&gt;(.*?)&lt;br&gt;"
猜你喜欢
  • 2018-11-16
  • 2014-07-03
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多