我正在尝试在具有以下html结构的Webpg上搜寻商店名称及其以下商店地址:
<div class="post_content entry-content" itemprop="articleBody">
<p>...</p>
<p>...</p>
<h2>1. SHOP NAME</h2>
<p>...</p>
<p>...</p>
<p><strong>Address</strong>: Dhoby Ghaut 238889<br />
<strong>Prices: </strong>Starting from SGD3.50 <br />
<strong>Websites</strong>:<a href="https://..." target="_blank" rel="noopener"></a></p>
<h2>2. SHOP NAME</h2>
.
.
<h2>3. SHOP NAME</h2>
.
.
</div>
他们没有为每个商店展示使用类。我在尝试弄清楚地址时遇到问题,有人知道怎么做吗?
这是我获取店铺名称的代码:
url= requests.get('https://avenueone.sg/recipes-food/bubble-tea-brands-singapore/').text
shop= []
address= []
soup = BeautifulSoup(url,'lxml')
for row in soup.find_all("h2"):
shop.append(row.text)
for line in row.find_all(string='Address'):
address.append(line.text)
import re
for i in soup.find('div', class_='post_content entry-content'):
for x in soup.find_all(re.compile("^Address")):
address.append(line.text)
我可以将商店名称列表检索到一个数据框中,但不能将其对应的地址检索到一个数据框中。
谁能帮我这个忙吗?
最佳答案
由于没有类,因此我不会使用BeautifulSoup并回退到正则表达式中以找到响应中的地址。如果格式稳定并且如您在问题中所描述的那样,我们可以使用以下正则表达式:
import re
address_pattern = "<strong>Address</strong>:(.+?)<br />"
addresses = re.findall(address_pattern, url)
我们仍然需要将地址与商店名称相关联,但是如何进行取决于您未给出的一些假设。如果每个商店只有一个地址,而这些商店都存储在变量
shops
中,则只需zip(shops, addresses)
。如果我们必须考虑某些商店名称下的地址缺失或多个地址,我们可以将响应分为多个商店条目,然后分别在每个商店名称下查找地址:
addresses = [
re.findall(address_pattern, chunk)
for chunk in url.split("<h2>")[1:]
]
现在,我们有了一个列表列表(可能有多个地址或没有地址),它们位于两个
"<h2>"
标记之间。现在,zip(shops, addresses)
将为我们提供一个元组的迭代器,其中第一个元素是商店名称,第二个元素是地址列表(可能为空)。