【问题标题】:Extracting the Address tag from HTML using BeautifulSoup使用 BeautifulSoup 从 HTML 中提取地址标签
【发布时间】:2021-01-21 04:49:22
【问题描述】:

似乎无法对以下 HTML 进行字符串处理:

[<address class="styles_address__zrPvy"><svg class="styles_addressIcon__3Pu3L" height="42" viewbox="0 0 32 42" width="32" xmlns="http://www.w3.org/2000/svg"><path d="M14.381 41.153C2.462 23.873.25 22.1.25 15.75.25 7.051 7.301 0 16 0s15.75 7.051 15.75 15.75c0 6.35-2.212 8.124-14.131 25.403a1.97 1.97 0 01-3.238 0zM16 22.313a6.562 6.562 0 100-13.125 6.562 6.562 0 000 13.124z"></path></svg>Level 1 44 Market Street<!-- -->, <!-- -->Sydney</address>]

“标题”工作正常,但“地址”未提取。

path = "C:\\Users\\mpeter\\Downloads\\lksd\\"

titleList = []

for infile in glob.glob(os.path.join(path, "*.html")):
    markup = (infile)
    soup = BeautifulSoup(open(markup, "r").read(), 'lxml')
    title = soup.find_all("title")
    title = soup.title.string
    titleList.append(title)
    
streetAddressList = []

for infile in glob.glob(os.path.join(path, "*.html")):
    markup = (infile)
    soup = BeautifulSoup(open(markup, "r").read(), 'lxml')
    address = soup.find_all("address", class_={"styles_address__zrPvy"})
    address = soup.address.string
    streetAddressList.append(address)
  
with open('output2.csv', 'w') as myfile:
   writer = csv.writer(myfile)
   writer.writerows((titleList, streetAddressList))

当我取出 address = soup.address.string 时,它可以工作,但会提取整个元素。

【问题讨论】:

  • 您可以使用regex 仅查找地址。当您已经在 adress 中获得了整个元素时
  • @grumpyp,现在调查一下。关于如何完成的任何指针我都在猜测'address = re.compile(r“Something”)'。不过不知道该放什么。

标签: python-3.x beautifulsoup


【解决方案1】:

使用 findall 我们可以获得所有匹配的内容。然后需要遍历结果集以获取每个内容。

使用此代码:

from bs4 import BeautifulSoup
import pandas as pd
strs = '[<address class="styles_address__zrPvy"><svg class="styles_addressIcon__3Pu3L" height="42" viewbox="0 0 32 42" width="32" xmlns="http://www.w3.org/2000/svg"><path d="M14.381 41.153C2.462 23.873.25 22.1.25 15.75.25 7.051 7.301 0 16 0s15.75 7.051 15.75 15.75c0 6.35-2.212 8.124-14.131 25.403a1.97 1.97 0 01-3.238 0zM16 22.313a6.562 6.562 0 100-13.125 6.562 6.562 0 000 13.124z"></path></svg>Level 1 44 Market Street<!-- -->, <!-- -->Sydney</address>] [<address class="styles_address__zrPvy"><svg class="styles_addressIcon__3Pu3L" height="42" viewbox="0 0 32 42" width="32" xmlns="http://www.w3.org/2000/svg"><path d="M14.381 41.153C2.462 23.873.25 22.1.25 15.75.25 7.051 7.301 0 16 0s15.75 7.051 15.75 15.75c0 6.35-2.212 8.124-14.131 25.403a1.97 1.97 0 01-3.238 0zM16 22.313a6.562 6.562 0 100-13.125 6.562 6.562 0 000 13.124z"></path></svg>14, Bengaluru<!-- -->, <!-- -->India</address>]'
soup = BeautifulSoup(strs, 'lxml')
addresses = soup.find_all(class_={"styles_address__zrPvy"})
addr = []
df = pd.DataFrame()
for address in addresses:
    addr.append(address.text)
df['address'] = addr
df

输出:

   address
0   Level 1 44 Market Street, Sydney
1   14, Bengaluru, India

现在地址列表在 Dataframe 中。您可以使用 df.to_csv() 将此数据帧写入 csv

【讨论】:

  • 嘿,它不起作用,因为它是一个“soup.find_all”。这样做的原因是因为我从多个文件中提取它。非常感谢任何帮助
  • 用 findall() 更新了答案
  • 嗨,Subbu,抱歉,我该如何实现它以便将列表写入 CSV?正如您从我上面的示例中看到的那样,它具有作为结束功能。非常感谢您的帮助。
  • 通过创建数据框并写入 csv 文件更新了答案
  • 嗨@Subbu VidyaSekar,很抱歉让您感到痛苦,但您可以修改它,以便它使用'glob'函数,因为它是从本地 HTML文件中提取的。上面的原始代码是我想要的。谢谢队友=)
猜你喜欢
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-29
  • 2014-05-22
  • 2020-01-07
相关资源
最近更新 更多