【发布时间】:2018-12-28 13:28:56
【问题描述】:
我在python 中结合BeautifulSoup 编写了一些代码,以在br 标记中获得一些addresses。如果是关于单独使用BeautifulSoup 解析所需的文本,我可以使用.next_sibling 来完成此操作,如下所示。我的意图是结合BeautifulSoup 和re 抓取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]+)*$")) -
没有关闭
</br>标记。br只是一个换行符 - 它不应该有结束标签 -
考虑提供它作为答案。您建议的方法非常有效@Wiktor Stribiżew。
-
@Wiktor Stribiżew,我无法理解在
$之前使用的*。因为在非捕获组中已经有一个+。 -
量词影响组内的整个模式序列。否则,它将仅匹配
ABC DEF字符串。使用*,它匹配ABC、ABC DEF、A-C B.F H#D字符串。
标签: python regex python-3.x web-scraping beautifulsoup