【问题标题】:trying to scrape data from html code using python [closed]尝试使用python从html代码中抓取数据[关闭]
【发布时间】:2016-08-01 12:04:10
【问题描述】:

我一直在为网站制作网络爬虫,我想使用 .findall 或其他可行的方法从 html 表中提取所有节点编号,但我很难得到它,我经常遇到错误显然没有放置正确的标签。

谁能帮忙,html代码如下

</div>

<table class="dataTable" cellpadding="5" cellspacing="0" rules="all" border="1" id="ctl00_ContentPlaceHolder1_dgNodes" style="border-collapse:collapse;">
    <tr class="header noBreak">
        <td>&nbsp;</td><td><a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$dgNodes$ctl00$ctl00','')">Node Name</a></td><td><a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$dgNodes$ctl00$ctl01','')">Description</a></td><td><a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$dgNodes$ctl00$ctl02','')">MAC Address</a></td><td><a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$dgNodes$ctl00$ctl03','')"></a>
                <a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$dgNodes$ctl00$liNodeRoleHeader','')" id="ctl00_ContentPlaceHolder1_dgNodes_ctl00_liNodeRoleHeader">Node Role</a>
            </td><td><a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$dgNodes$ctl00$ctl04','')">Firmware</a></td><td>
                <a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$dgNodes$ctl00$lbUptimeHeader','')" id="ctl00_ContentPlaceHolder1_dgNodes_ctl00_lbUptimeHeader">Uptime</a>
            </td><td><a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$dgNodes$ctl00$ctl05','')">Users</a></td>
    </tr><tr onmouseover="this.className = 'highlightedRow';" onmouseout="this.className = 'normalRow';" onclick="GoToNodePage('522');" style="height:18px;">

我需要在代码的最后一行提取数字 522 和所有其他 gotonodepage 数字,但我无法弄清楚,感谢任何帮助。我也想把提取出来的数字放到以后使用的列表中。

r2 = s2.get(webpage)
bsobjswap = BeautifulSoup(r2.content)

listy = []
for link in bsobjswap.findall('tr'):
    if 'onclick' in link.attrs:
        listy.append(link)
print (listy)

错误是 对于 bsobjswap.findall('tr') 中的链接: TypeError: 'NoneType' 对象不可调用

【问题讨论】:

  • 你的代码?错误信息?
  • webpage = "mycompanywebsite.com" r2 = s2.get(webpage) bsobjswap = BeautifulSoup(r2.content) listy = [] for link in bsobjswap.findall('tr'): if 'onclick ' 在 link.attrs: listy.append(link) print (listy)
  • errors are the standard TypeError: 'NoneType' object is not callable,显然是因为代码错误,我没有找到任何数据
  • 不在 cmets 中,编辑您的问题。
  • 对不起

标签: python html web-scraping beautifulsoup


【解决方案1】:

试试这样的:

from bs4 import BeautifulSoup

xml = """<table class="dataTable" cellpadding="5" cellspacing="0" rules="all" border="1" id="ctl00_ContentPlaceHolder1_dgNodes" style="border-collapse:collapse;">
    <tr class="header noBreak">
        <td>&nbsp;</td><td><a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$dgNodes$ctl00$ctl00','')">Node Name</a></td><td><a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$dgNodes$ctl00$ctl01','')">Description</a></td><td><a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$dgNodes$ctl00$ctl02','')">MAC Address</a></td><td><a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$dgNodes$ctl00$ctl03','')"></a>
                <a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$dgNodes$ctl00$liNodeRoleHeader','')" id="ctl00_ContentPlaceHolder1_dgNodes_ctl00_liNodeRoleHeader">Node Role</a>
            </td><td><a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$dgNodes$ctl00$ctl04','')">Firmware</a></td><td>
                <a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$dgNodes$ctl00$lbUptimeHeader','')" id="ctl00_ContentPlaceHolder1_dgNodes_ctl00_lbUptimeHeader">Uptime</a>
            </td><td><a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$dgNodes$ctl00$ctl05','')">Users</a></td>
    </tr><tr onmouseover="this.className = 'highlightedRow';" onmouseout="this.className = 'normalRow';" onclick="GoToNodePage('522');" style="height:18px;">"""

soup = BeautifulSoup(xml)
print([i.get('onclick') for i in soup.findAll('tr', attrs={'onclick':True})])

这将返回["GoToNodePage('522');"]

例如,您可以从这里使用正则表达式提取数字

print([re.findall("\d+", i.get('onclick')) for i in soup.findAll('tr', attrs={'onclick':True})])

这将返回[['522']]

【讨论】:

  • 感谢 Gábor Erdős 完美运行,一个问题我如何才能将结果放入列表中,我似乎在努力解决这个问题
  • 没关系,我想通了
  • 其实这个结果是一个嵌套列表。您可以从findAllBeautifullSoupfindallre 中获得一个列表。所以结果将是列表中的列表。如果tr 标签可能只包含一个onclick 属性,您可以将refindall 切换为简单的find,您将得到一个列表。这取决于问题(整个 xml)
  • 谢谢 Gábor Erdős,你能帮我做一件事吗,我需要把它弄到一个节点号就在那里的地步,这样我就可以将它们附加到一个 URL 上,比如 www.companysite。 com?NodeID=522 之类的东西,但是当我尝试将它们附加在一起时,我得到 TypeError: Can't convert 'list' object to str implicitly
  • 例如使用result[0](假设您将输出存储在变量result中)。这将为您提供列表的第 0 个(第一个)元素。如果它是一个嵌套列表 result[0][0] 将为您提供外部列表的第 0 个(第一个)内部列表的第 0 个(第一个)元素
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2021-03-08
  • 1970-01-01
相关资源
最近更新 更多