【问题标题】:Webscraping the contents of a tables网页抓取表格的内容
【发布时间】:2019-07-10 12:11:09
【问题描述】:

您好,我正在尝试使用 Python 和 Beautiful Soup 来抓取网页。网页中有各种表格,其中包含我想要的结果,但我正在努力: 1) 找到合适的表 2)找到正确的两个单元格 3) 将单元格 1 和 2 分别写入字典键和值。

到目前为止,在发出请求并解析 HTML 之后,我使用:

URL='someurl.com'

def datascrape(url):
    page=requests.get(url)
    print ("requesting page")
    soup = BeautifulSoup(page.content, "html.parser")
    return(soup)

soup=datascrape(URL)

results = {}
for row in soup.findAll('tr'):
    aux = row.findAll('td')
    try:
        if "Status" in (aux.stripped_strings):
            key=(aux[0].strings)
            value=(aux[1].string)
            results[key] = value
    except:
        pass
print (results)

不幸的是,“结果”总是空的。我真的不确定我哪里出错了。谁能给我指点一下?

【问题讨论】:

  • 可能有多种原因,包括(但不限于)动态生成的表格。如果您可以提供网址和预期结果,有人可以回答。
  • 您查看过请求吗?您是否真的查看了被请求的真实 HTML(不是通过您的浏览器)?我将猜测您尝试抓取的内容实际上不在您请求的页面中。请对加载该网站时发出的所有请求进行一些调查。
  • 无法提供帮助,因为我们无法在没有目标站点的情况下复制您的问题
  • 这是我试图抓取的 URL 示例:sitem.herts.ac.uk/aeru/bpdb/Reports/2070.htm 是的,我查看了返回的 HTML,它似乎相当简单,虽然我不太了解真的是 HTML。
  • 如果您准确指出您希望看到的返回值,这将有所帮助。

标签: python dictionary web-scraping html-table


【解决方案1】:

我不确定您为什么使用 findAll() 而不是 find_all(),因为我对网络抓取还很陌生,但我认为这可以为您提供所需的输出。

URL='http://sitem.herts.ac.uk/aeru/bpdb/Reports/2070.html'
def datascrape(url):
    page=requests.get(url)
    print ("requesting page")
    soup = BeautifulSoup(page.content,     
"html.parser")
    return(soup)

soup=datascrape(URL)

results = {}
table_rows = soup.find_all('tr')
for tr in table_rows:
    td = tr.find_all('td')
    row = [i.text for i in td]
    try:
        for i in row:
            if "Status" in i:
                key=(row[0].strip())
                value=(row[1].strip())
                results[key] = value
    else:
        pass
print(results)

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    如果在状态和不适用之后,您可以使用位置 nth-of-type css 选择器。这确实取决于页面之间的位置是否相同。

    import requests
    from bs4 import BeautifulSoup
    
    url ='https://sitem.herts.ac.uk/aeru/bpdb/Reports/2070.htm'
    page=requests.get(url)
    soup = BeautifulSoup(page.content, "lxml")
    tdCells = [item.text.strip() for item in soup.select('table:nth-of-type(2) tr:nth-of-type(1) td')]
    results = {tdCells[0] : tdCells[1]}
    print(results)
    

    【讨论】:

    • 谢谢我以前没有遇到过这个。我认为这会有所帮助。
    猜你喜欢
    • 2010-10-09
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多