簡體   English   中英

web 從表中刮取某一行

[英]web scraping a certain row from a table

我正在努力從這個網站上抓取某一行。

首先,表格元素中沒有 class 但我想我有一個解決方法。

我的問題是我想打印(或存儲在變量中或訪問數據)某行,假設第一個值“Bollate”的行:網站中該行的屏幕截圖

所以我編碼:

import requests
import bs4

URL = "http://www.centrometeolombardo.com/content.asp?CatId=332&ContentType=Dati"

response = requests.get(URL)
soup = bs4.BeautifulSoup(response.text, "lxml")

table = soup.find(text="Bollate").find_parent("table")

for a in table:
    if a.text == "Bollate":
       for val in a.parent-find_next_siblings():
           print(val.text)

但我得到:

Traceback (most recent call last):
  File "/home/pi/Documents/Python/ngu.py", line 12, in <module>
   if a.text == "Bollate":
  File "/usr/lib/Python3/dist-packages/bs4/element.py", line 370, in _getattr_
   self._class_._name_, attr))
AttributeError: 'NavigableString' object has no attribute 'text'

這表明我錯了,因為我得到的東西不是文本,但我不知道如何克服這個問題。

謝謝大家

您可以使用:contains 和:has 隔離行,以確保 b 標記帶有該文本在 tr 中。 您還需要定位正確的嵌套表,例如使用 nth-child

import requests
from bs4 import BeautifulSoup

page_source = requests.get('http://www.centrometeolombardo.com/content.asp?CatId=332&ContentType=Dati').text
soup = BeautifulSoup(page_source, 'lxml')
print([td.get_text(strip=True) for td in soup.select('div:nth-child(5) table:nth-child(3) tr:has(b:contains("Bollate")) td')])
    

感謝@SIM 指出可以通過使用以下模式來避免對索引進行硬編碼:

soup.select("table > tr:has(> td > a:contains('Bollate')) td")

您可以使用pandas抓取HTML並解析表。 然后只需 select 您需要的值。

就是這樣:

import pandas as pd

url = "http://www.centrometeolombardo.com/content.asp?CatId=332&ContentType=Dati"
df = pd.read_html(url, flavor="bs4")[19]
print(df.loc[df[0] == "Bollate"])

Output:

         0     1     2      3  4  5
2  Bollate  -0.3  12.3  Brina  -  -

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM