Python 用于返回这些值的正则表达式或其他方法(从BeautifulSoup)

Python 用于返回这些值的正则表达式或其他方法(从BeautifulSoup),python,regex,beautifulsoup,Python,Regex,Beautifulsoup,在stackoverflow社区的大量帮助下,我学习了很多关于python的知识,特别是使用BeautifulSoup进行清理。我再次提到的是我用来学习如何解决这个问题的同一个示例页面 我有以下代码: from bs4 import BeautifulSoup import re f = open('webpage.txt', 'r') g = f.read() soup = BeautifulSoup(g) for heading in soup.find_all("td", class_

在stackoverflow社区的大量帮助下,我学习了很多关于python的知识,特别是使用BeautifulSoup进行清理。我再次提到的是我用来学习如何解决这个问题的同一个示例页面

我有以下代码:

from bs4 import BeautifulSoup
import re

f = open('webpage.txt', 'r')
g = f.read()
soup = BeautifulSoup(g)

for heading in soup.find_all("td", class_="paraheading"):
    key = " ".join(heading.text.split()).rstrip(":")
    if key in columns:
        print key
        next_td = heading.find_next_sibling("td", class_="bodytext")
        value = " ".join(next_td.text.split())
        print value
    if key == "Industry Categories":
        print key
        ic_next_td = heading.find_next_sibling("td", class_="bodytext")
        print ic_next_td
从本页中:

http://www.aidn.org.au/Industry-ViewCompany.asp?CID=3113
另存为webpage.txt会给出以下结果:

ACN
007 350 807
ABN
71 007 350 807
Annual Turnover
$5M - $10M
Number of Employees
6-10
QA
ISO9001-2008, AS9120B,
Export Percentage
5 %
Industry Categories
<td class="bodytext">Aerospace<br/>Land (Vehicles, etc)<br/>Logistics<br/>Marine<br/>Procurement<br/></td>
Company Email
lisa@aerospacematerials.com.au
Company Website
http://www.aerospacematerials.com.au
Office
2/6 Ovata Drive Tullamarine VIC 3043
Post
PO Box 188 TullamarineVIC 3043
Phone
+61.3. 9464 4455
Fax
+61.3. 9464 4422
我尝试过一些正则表达式,例如:

if key == "Industry Categories":
        print key
        ic_next_td = heading.find_next_sibling("td", class_="bodytext")
        value = re.findall('\>(.*?)\<', ic_next_td)
        print value[0]
这个代码产生了一个缩进错误:

for heading in soup.find_all("td", class_="paraheading"):
    key = " ".join(heading.text.split()).rstrip(":")
    if key in columns:
        print key
        next_td = heading.find_next_sibling("td", class_="bodytext")
        value = " ".join(next_td.text.split())
        print value
    if key == "Industry Categories":
        print key
        ic_next_td = heading.find_next_sibling("td", class_="bodytext")
        for value in ic_next_td.strings:
            print value

注意工作代码中打印值的双缩进。在我看来,下一级缩进将是对ic_next_td中的值在
之后的单个缩进。字符串:

您必须进一步解析
ic_next_td
的内容。幸运的是,原始页面使用

标记为您提供了分隔文本的位置。不要在这里使用正则表达式,BeautifulSoup为您提供了更好的工具:

for value in ic_next_td.strings:
    print value
将导致:

Aerospace
Land (Vehicles, etc)
Logistics
Marine
Procurement
您可以通过在以下位置调用
list()
将所有这些存储在列表中:


您可以按

进行拆分以获得每个值。非常感谢@MartijnPieters!我知道一定有一种我忽略了的漂亮的方法。接下来的一个问题是,在将此代码集成到现有代码中时,为什么必须对“print value”进行双缩进,否则会出现缩进错误?如果这不是一个明确的问题,我将更新op以更清楚地显示。@FusilliJerry:因为
打印
是的
的一部分。。在..:
循环中。比
for
语句缩进更深一级的所有内容都是循环每次迭代将执行的行集合的一部分。谢谢。有没有可能在这里略述一下.strings方法的工作原理?根据我的需要,文档对这个主题有一点了解()。它是否尝试使用一致的标记来分解引用中的文本?例如,它是否适用于除br以外的标签?谢谢@MartijnPieters@FusilliJerry:在XML/HTML解析中,所有内容都是一个节点,文本也包含在节点中,但其他标记也是如此。
.strings
生成器为您提供所有离散文本节点。因此,文本<代码>航空航天在一个文本节点中,因为在一个节点中不能有<代码>航空航天和<代码>土地(车辆等)<代码>,因为中间有一个<代码> BR/> < /代码>。不过,它也适用于嵌套,因此
textothertext
会给你
text
然后
other text
@FusilliJerry:如果你有不同的问题,请写一篇新文章(先搜索重复项后)。让我们一次只关注一个问题。
for value in ic_next_td.strings:
    print value
Aerospace
Land (Vehicles, etc)
Logistics
Marine
Procurement
values = list(ic_next_td.strings)