我试图抓取特定网站的内容并渲染输出,以便可以在其他媒介中进一步操作/使用它。我面临的最大挑战是,很少有标签具有唯一的ID或类,并且一些内容仅显示在标签之间,例如<br></br>TEXT<br></br>
(例如,参见&#34;排名&#34;在下面的示例HTML中。)
不知何故,我创造了工作代码 - 即使与四年级某人的技能相称 - 但这是我得到的最远的,我希望得到一些帮助,如何继续提取相关信息。最终,我希望在标签中提取任何纯文本,在标签之间提取纯文本。唯一的例外是,只要有一个img的word_icon_b.gif或word_icon_R.gif,那么文本&#34; active&#34;或者&#34;不活跃&#34;取代。
以下是我设法凑齐的代码:
from bs4 import BeautifulSoup
import urllib2
pageFile = urllib2.urlopen("http://www.url.com")
pageHtml = pageFile.read()
pageFile.close()
soup = BeautifulSoup("".join(pageHtml))
table = soup.findAll("td",{"class": ["row_col_1", "row_col_2"]})
print table
页面中有几个表,但没有一个具有唯一的ID或类,所以我没有引用它们,而只是拉出了TD - 因为这些是唯一具有独特类别的标签我正在寻找的信息。上面提到的HTML如下:
<tr>
<td class="row_col_1" valign="top" nowrap="" scope="row">
5/22/2014
</td>
<td class="row_col_1" valign="top" scope="row">
100%
</td>
<td class="row_col_1" valign="top" nowrap="" scope="row">
<a target="_top" href="/NY/2014/N252726.DOC">
<img width="18" height="14" border="0" alt="Click here to download word document n252726.doc" src="images/word_icon_b.gif"></img>
</a>
<a target="_top" href="index.asp?ru=n252726&qu=ranking&vw=detail">
NY N252726
</a>
<br></br>
Ranking
<br></br>
<a href="javascript:disclaimer('EU Regulatory Body','h…cripts/listing_current.asp?Phase=List_items&lookfor=847720');">
8477.20.mnop
</a>
<br></br>
<a target="_new" href="http://dataweb.url.com/scripts/ranking_current.asp?Phase=List_items&lookfor=847759">
8477.59.abcd
</a>
<br></br>
</td>
<td class="row_col_1" valign="top" scope="row">
The ranking of a long-fanged monkey sock puppet that is coding-ly challenged
</td>
<td class="row_col_1" valign="top" nowrap="" scope="row">
</td>
</tr>
我有[&#34; row_col_1&#34;,&#34; row_col_2&#34;]的原因是因为提供的数据对于奇数行显示为<td class="row_col_1" valign="top" nowrap="" scope="row">
,{{1对于偶数行。我无法控制试图从中拉出的HTML。
此外,基本链接(例如<td class="row_col_2" valign="top" nowrap="" scope="row">
和javascript:disclaimer('EU Regulatory Body','h…cripts/listing_current.asp?
)将始终保持不变(尽管特定链接会发生变化,例如http://dataweb.url.com/scripts/ranking_current.asp?Phase=List_items&
可能会在下一页上显示为current.asp?Phase=List_items&lookfor=847759"
current.asp?Phase=List_items&lookfor=101010">
)。
编辑: @Martijn:我希望从HTML中回复以下项目:1)5/22 / 2014,2)100%,3)图像name,word_icon_b.gif(替换它的文本)4)NY N252726(和前面的链接),5)排名,6)8477.20.mnop(和前面的链接),7)8477.59.abcd(和前面的链接) ,和#);一个长期受欢迎的猴子袜子傀儡的排名正在编码挑战。&#39;
我希望将输出包装在XML标记中,但这并不重要,我想这些标记只能插入到bs4代码中。
答案 0 :(得分:0)
如果您想尝试lxml library和xpath,这可以提示您的代码的外观。您可能应该更好地选择所需的<tr>
,而不是看到html代码。你也应该处理任何潜在的IndexErrors等。
from lxml import html
pageFile = urllib2.urlopen("http://www.url.com")
pageHtml = pageFile.read()
pageFile.close()
x = html.fromstring(pageHtml)
all_rows = x.xpath(".//tr")
results = []
for row in all_rows:
date = row.xpath(".//td[contains(@class, 'row_col')/text()]")[0]
location = row.xpath(".//a[contains(@href, 'index.asp')/text()]")[0]
rank = row.xpath(".//a[contains(@href, 'javascript:disclaimer(')]/text()")[0]
results.append({'date': date, 'location': location, 'rank': rank})