python - 使用正则表达式改进 html 代码中的过滤器链接
问题描述
我的项目的目的是web scrap
一个搜索引擎(我选择了DuckDuckGo
)。要获取第一页上的所有链接,然后输入这些链接中的每一个,请获取HTML
源代码并执行一个正则表达式,该表达式将过滤.onion
HTML 代码中的所有网站。
我将从这里假设我们已经在网页上抓取了搜索引擎并在第一页中获取了所有网站(我在 DuckDuckGo 上的搜索词是:暗网“.onion”)
这就是代码的运行方式(我将在代码中详细说明comments
):
import requests
from bs4 import BeautifulSoup
import urllib.parse
import re
html_data=[]
#This will be the list that will contains the HTML code of
#each website I visit. For example, html_data[0]
#will contain all the html source code of the first website,
#html_data[1] of the second website and so on.
for x in links: #links is the list that contains all the websites that I got from web scraping DuckDuckGo.
data = requests.get(str(x))
html_data.append(data.text)
#Now html_data contains all the html source code of all the websites in links
print("")
print("============================ONIONS================================")
print("")
#Here I pass a regex to filter all the content in each case of the list (so that I get only .onion links)
for x in html_data:
for m in re.finditer(r'(?:https?://)?(?:www)?(\S*?\.onion)\b', x, re.M | re.IGNORECASE):
print(m.group(0))
所以我的代码运行良好。但是有一个简单的问题。正则表达式没有正确过滤所有内容。一些 HTML 代码嵌套在我的 .onion 网站中。而且,我经常.onion
在输出中独处。
以下是输出示例:
href="http://jv7aqstbyhd5hqki.onion
class="external_link">http://jv7aqstbyhd5hqki.onion
href="http://xdagknwjc7aaytzh.onion
data-qt-tooltip="xdagknwjc7aaytzh.onion
">http://xdagknwjc7aaytzh.onion
href="http://sbforumaz7v3v6my.onion
class="external_link">http://sbforumaz7v3v6my.onion
href="http://kpmp444tubeirwan.onion
class="external_link">http://kpmp444tubeirwan.onion
href="http://r5c2ch4h5rogigqi.onion
class="external_link">http://r5c2ch4h5rogigqi.onion
href="http://hbjw7wjeoltskhol.onion
class="external_link">http://hbjw7wjeoltskhol.onion
href="http://khqtqnhwvd476kez.onion
class="external_link">http://khqtqnhwvd476kez.onion
href="http://jahfuffnfmytotlv.onion
class="external_link">http://jahfuffnfmytotlv.onion
href="http://ocu3errhpxppmwpr.onion
class="external_link">http://ocu3errhpxppmwpr.onion
href="http://germanyhusicaysx.onion
data-qt-tooltip="germanyhusicaysx.onion
">http://germanyhusicaysx.onion
href="http://qm3monarchzifkwa.onion
class="external_link">http://qm3monarchzifkwa.onion
href="http://qm3monarchzifkwa.onion
class="external_link">http://qm3monarchzifkwa.onion
href="http://spofoh4ucwlc7zr6.onion
data-qt-tooltip="spofoh4ucwlc7zr6.onion
">http://spofoh4ucwlc7zr6.onion
href="http://nifgk5szbodg7qbo.onion
class="external_link">http://nifgk5szbodg7qbo.onion
href="http://t4is3dhdc2jd4yhw.onion
class="external_link">http://t4is3dhdc2jd4yhw.onion
我想知道如何改进这一点regex
,以便获得.onion
正确格式的链接。
解决方案
你可以使用这个正则表达式。它匹配.onion
的 URL
它适用于源 html,获取/测试任何标签的 href 属性。
您不需要使用正则表达式选项,因为它们是内联的。
你想要的在Capture group 3
.
r"(?si)<[\w:]+(?=(?:[^>\"']|\"[^\"]*\"|'[^']*')*?(?<=\s)href\s*=\s*(?:(['\"])\s*(((?!mailto:)(?:(?:https?|ftp)://)?(?:(?:(?!\1)\S)+(?::(?:(?!\1)\S)*)?@)?(?:(?:[a-z\u00a1-\uffff0-9]-?)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-?)*[a-z\u00a1-\uffff0-9]+)*?\.onion\b)(?:(?!\1).)*?)\s*\1))\s+(?:\".*?\"|'.*?'|[^>]*?)+>"
https://regex101.com/r/oeYCxX/1
可读版本
(?si) # Dot-all and case insensitive modifiers
< [\w:]+ # Any tag
(?=
(?: [^>"'] | " [^"]* " | ' [^']* ' )*?
(?<= \s )
href \s* = \s* # href attribute
(?:
( ['"] ) # (1)
\s*
( # (2 start), Full url
( # (3 start), The url up to '.onion'
(?! mailto: )
(?:
(?: https? | ftp )
://
)?
(?:
(?:
(?! \1 )
\S
)+
(?:
:
(?:
(?! \1 )
\S
)*
)?
@
)?
(?:
(?: [a-z\u00a1-\uffff0-9] -? )*
[a-z\u00a1-\uffff0-9]+
)
(?:
\.
(?: [a-z\u00a1-\uffff0-9] -? )*
[a-z\u00a1-\uffff0-9]+
)*?
\.onion \b
) # (3 end)
(?: # Parameters
(?! \1 )
.
)*?
) # (2 end)
\s* \1
)
)
\s+
(?: " .*? " | ' .*? ' | [^>]*? )+
>
推荐阅读
- javascript - Highcharts - 实时更新柱形图
- excel - 对应单元格中所有值的总和,针对特定日历月和公司
- node.js - 在 mongo 数据库中创建动态模式
- php - 未捕获的错误:找不到类“PhpAmqpLib\Connection\AMQPStreamConnection”
- html - 在我的 html 模板中以 Angular 6 显示而不是空格
- docker - Kubernetes 从单个节点引用 docker 映像并在任何节点中创建容器
- swift - 为什么我的 DateFormatter .date(from: String) 返回 nil
- pascalscript - 我如何获得 shift+insert 的 ascii 代码
- codeigniter - 编辑/删除按钮的数据表 (Codeigniter) - 在 href 标签上传递参数
- javascript - 使用 javascript 从字符串 html 中读取 span 标签值