我的代碼的功能是讀取 xlxs 表(即 stackoverflow.com)上的 URL 串列。
然后它會轉到 stackoverflow.com 并檢查主頁上是否有鏈接的 Instagram 帳戶,如果有,它會回傳該鏈接并將其寫入相鄰的列中。
但是,某些站點會將其列在多個位置、頁眉、頁腳或具有將多個結果回傳到單元格的提要。
有沒有辦法只回傳一個結果?
for cell in sheet[col][1:]:
try:
url = cell.value
r = requests.get(url)
ig_get = ['instagram.com']
ig_get_present = []
soup = BeautifulSoup(r.content, 'html5lib')
all_links = soup.find_all('a', href=True)
print(cell.value)
for ig_get in ig_get:
for link in all_links:
if ig_get in link.attrs['href']:
ig_get_present.append(link.attrs['href'])
ig_got = str(ig_get_present)
print(ig_got)
sheet.cell(cell.row, col2).value = ig_got
except requests.exceptions.ConnectionError:
pass
except requests.exceptions.TooManyRedirects:
pass
except requests.exceptions.MissingSchema:
pass
為清楚起見進行編輯:
一些域將有多個指向其社交媒體頁面的鏈接,即一個在頁眉中,一個在頁腳中,一個在導航欄中,等等,或者是他們社交媒體提要的鏡像。在這些情況下,我會在單元格中輸出多個相同的鏈接:
['https://instagram.com/xxx', 'https://instagram.com/xxx', 'https://instagram.com/xxx']
我只想要其中一個,而不是全部。
uj5u.com熱心網友回復:
如果您只想將第一個匹配項輸入到單元格中,那么您真正需要的只是在第一個匹配項之后立即放置一個 break 陳述句。
例如:
...
...
url = cell.value
res = requests.get(url)
domain = 'instagram.com'
urls = []
soup = BeautifulSoup(res.content, 'html5lib')
all_links = soup.find_all('a', href=True)
for link in all_links:
if domain in link['href']:
url = link['href']
urls.append(url)
sheet.cell(cell.row, col2).value = url
break
...
...
python 中的break陳述句是一個控制流陳述句,它可以立即讓你脫離代碼正在執行的任何回圈。
您可以在 python 檔案https://docs.python.org/3/tutorial/controlflow.html#break-and-continue-statements-and-else-clauses-on-loops中閱讀有關它的更多資訊
uj5u.com熱心網友回復:
更簡潔的方法是使用帶有 contains (*) 運算子的 css 屬性選擇器,指定應該找到的域,使用 select_one 僅回傳第一個匹配項
domain = 'instagram.com'
soup.select_one(f'a[href*="{domain}"]')
uj5u.com熱心網友回復:
除了抓取每個網站之外,另一種選擇是使用 google dorks 并讓 google 為您完成作業
google dorks 就像是縮小搜索范圍的特定查詢
由于某些網站會將其 instagram 用戶名鏈接到與主頁不同的頁面上,因此上述方法在這種情況下不起作用,但是如果您以這種格式進行谷歌搜索
Site:stackoverflow.com intext:"https://www.instagram.com/"
谷歌將回傳與該特定網站相關的文本中包含https://www.instagram.com/的所有頁面
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/486874.html
下一篇:以這些格式從json中提取資料
