Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html 网页抓取:需要帮助返回整个段落的文字时,关键字被发现_Html_Python 3.x_Web Scraping_Beautifulsoup - Fatal编程技术网

Html 网页抓取:需要帮助返回整个段落的文字时,关键字被发现

Html 网页抓取:需要帮助返回整个段落的文字时,关键字被发现,html,python-3.x,web-scraping,beautifulsoup,Html,Python 3.x,Web Scraping,Beautifulsoup,我正在尝试创建一个网页抓取脚本,允许我根据关键字抓取网站数据。因此,如果关键词出现在网站上,它应该返回整个段落(或者更好地返回整个工作清单和描述)。但是,我的代码atm只返回我搜索的实际关键字,而不是关键字所在的整个段落。这是我的密码: import requests from bs4 import BeautifulSoup as Bsoup keywords = ["KI", "AI", "Big Data", "Data", "data", "big data", "Analytic

我正在尝试创建一个网页抓取脚本,允许我根据关键字抓取网站数据。因此,如果关键词出现在网站上,它应该返回整个段落(或者更好地返回整个工作清单和描述)。但是,我的代码atm只返回我搜索的实际关键字,而不是关键字所在的整个段落。这是我的密码:

import requests

from bs4 import BeautifulSoup as Bsoup


keywords = ["KI", "AI", "Big Data", "Data", "data", "big data", "Analytics", "analytics", "digitalisierung", "ML",
        "Machine Learning", "Baumeisterarbeiten"]

headers = {''}


url = "https://www.auftrag.at//tenders.aspx"


data = requests.get(url, headers=headers, timeout=5)


soup = Bsoup(data.text, 'html.parser')


# jobs = soup.find_all('div', {'class': 'article'})


jobs = soup.find_all(string=["KI", "AI", "Big Data", "Data", "data", "big data", "Analytics", "analytics", "digitalisierung", "ML",
        "Machine Learning"])

print(jobs)


for word in jobs:
   print(word)

您可以更改
find_all
以将文本与正则表达式匹配:

jobs = soup.find_all('p',text=re.compile(r'|'.join(keywords)))
因此,完整代码将是:

import requests
import re
from bs4 import BeautifulSoup as Bsoup


keywords = ["KI", "AI", "Big Data", "Data", "data", "big data", "Analytics", "analytics", "digitalisierung", "ML",
        "Machine Learning", "Baumeisterarbeiten"]

url = "https://www.auftrag.at//tenders.aspx"
data = requests.get(url, timeout=5)


soup = Bsoup(data.text, 'html.parser')


# jobs = soup.find_all('div', {'class': 'article'})

jobs = soup.find_all('p',text=re.compile(r'|'.join(keywords)))

print(len(jobs))

for word in jobs:
   print(word)
这里的输出给出了136个结果

编辑:

我会为
KI
添加单词边界以避免错过匹配,比如
KILL

所以我要写这个正则表达式:

jobs = soup.find_all('p',text=re.compile(r'\b(?:%s)\b' % '|'.join(keywords)))

既然共识似乎是这样,这里有一个非正则表达式的替代方案:

import requests
from bs4 import BeautifulSoup as bs4


keywords = ["KI", "AI", "Big Data", "Data", "data", "big data", "Analytics", "analytics", "digitalisierung", "ML",
    "Machine Learning", "Baumeisterarbeiten"]

url = "https://www.auftrag.at//tenders.aspx"
data = requests.get(url, timeout=5)


soup = bs4(data.text, 'html.parser')
jobs = soup.find_all('p')

for keyword in keywords:    
   for job in jobs:
       if keyword in str(job):
           print(job)            

输出结果为138个,而@Maaz的答案为136个(不确定为什么会有差异)。

请添加网页的
URL
,以便进行适当分析。您好,我添加了实际的URL,希望这有帮助!但是,这种方法取决于网页开发人员是否正确使用标签。你可以只做
jobs=soup.find_all(text=re.compile(r'|'.join(关键字))
,如果你只想与文本匹配,这太棒了,工作起来很有魅力!非常感谢您的快速帮助:)非常感谢,非常简洁:)非常有趣的阅读感谢分享!阅读您链接的帖子,我认为我的答案没有问题,因为它使用bs4查找标记,并使用正则表达式匹配标记内的文本。这里不使用它来直接匹配HTML。因此,在我看来,在这种情况下使用正则表达式应该不是问题。但是如果有人有一个最好的解释,我当然会这么认为:-)顺便说一下,如果我remember@Maaz-反对regex的评论并不是对你的答案的抨击;只是因为我在很多答案(和其他地方)中多次看到这个想法,所以我产生了一种下意识的反应:我看到html,我关闭了我大脑中的正则表达式部分(比如…),是的,我理解了,没有担心:-),但我觉得讨论它很有趣