我的理解是正则表达式是穷人处理beautifulsoup的方法,但我想知道如果在我试图解析的html中没有明确定义的标签,这是否是我唯一的选择?
我最终只是试图从html中获取一些简单的数据......但它只是在一系列表中看起来像这样:
<table width="733" border="0" cellpadding="2">
<tr>
<td align="right" valign="top" nowrap="nowrap" bgcolor="#29ff36">
<font size="-1" face="Verdana, Arial, Helvetica, sans-serif">
<strong>
PART CODE:
</strong>
</font>
</td>
<td align="left" valign="top" nowrap="nowrap">
<font size="-1" color="#7b1010" face="Verdana, Arial, Helvetica, sans-serif">
PART# (//THIS IS WHAT I WANT)
</font>
</td>
<td>
</td>
如果没有正则表达式,有没有一种方法可以解决这个问题?
感谢帮助人员。这个网站令人难以置信
行:
这些表中大约有15个,每个表都有一个标签(例如Cost,Vendor,On-Hand),它位于第一个单元格中,然后我实际想要的数据总是在下一个单元格中。
label = 'Price:'
rows = soup.findAll('tr')
for tr in rows:
cols = tr.findAll('td')
for td in cols:
if td.find(text=True) == label:
print td.find(text=True)
这足以找到带有标签的正确单元格......我现在基本上只需要找到下一个单元格。根据beautifulsoup文档的“下一步”命令并没有真正实现这一点。 有什么想法吗?
答案 0 :(得分:2)
您也可以使用lxml
代替beautifulsoup
执行此操作。由于lxml.html
方法,我切换到使用cssselect()
而不是beautifulsoup
。它需要css规则,就像你在css文件或jQuery中使用一样。
from lxml.html import fromstring
raw_html_data = """ ... your html data here ... """
doc = fromstring(raw_html_data)
part_number = doc.cssselect('td[align=left] font')[0].text
# part_number.strip() # optionally strip leading and trailing whitespace
您可以使用pip
安装lxml
。
$ pip install lxml
银盘解决方案:
# ... starting with doc from above
info = []
target_trs = doc.cssselect('table tr') # tweak based on actual html
for tr in trs:
target_cells = tr.cssselect('td font')
label = target_cells[0].text.strip()
data = target_cells[1].text.strip()
info.append((label,data))
# now you have an array of (label,data) pairs in info
答案 1 :(得分:0)
您提供的示例并不完全清楚,但这是一个片段,它将从示例HTML源代码中检索Part#:
columns = soup.findAll('td')
for col in columns:
try:
part = col.find("font", {"color": "#7b1010"}).contents[0]
print(part)
except:
pass
答案 2 :(得分:-1)
lxml人声称可以使用格式错误的HTML。