从标签之间拉出信息,没有唯一的类或ID

时间:2014-06-01 00:16:06

标签: python beautifulsoup

我试图抓取特定网站的内容并渲染输出,以便可以在其他媒介中进一步操作/使用它。我面临的最大挑战是,很少有标签具有唯一的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代码中。

1 个答案:

答案 0 :(得分:0)

如果您想尝试lxml libraryxpath,这可以提示您的代码的外观。您可能应该更好地选择所需的<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})