我正在尝试在具有以下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)将为我们提供一个元组的迭代器,其中第一个元素是商店名称,第二个元素是地址列表(可能为空)。

09-11 20:54