Merge pull request #2674 from InfinityPacer/dev

This commit is contained in:
jxxghp
2024-09-01 06:56:48 +08:00
committed by GitHub
13 changed files with 35 additions and 23 deletions
+1 -1
View File
@@ -205,7 +205,7 @@ class SiteChain(ChainBase):
logger.error(f"获取站点页面失败:{url}") logger.error(f"获取站点页面失败:{url}")
return favicon_url, None return favicon_url, None
html = etree.HTML(html_text) html = etree.HTML(html_text)
if html: if StringUtils.is_valid_html_element(html):
fav_link = html.xpath('//head/link[contains(@rel, "icon")]/@href') fav_link = html.xpath('//head/link[contains(@rel, "icon")]/@href')
if fav_link: if fav_link:
favicon_url = urljoin(url, fav_link[0]) favicon_url = urljoin(url, fav_link[0])
+1 -1
View File
@@ -363,7 +363,7 @@ class RssHelper:
return "", f"获取RSS链接失败:无法连接 {url} " return "", f"获取RSS链接失败:无法连接 {url} "
# 解析HTML # 解析HTML
html = etree.HTML(html_text) html = etree.HTML(html_text)
if html: if StringUtils.is_valid_html_element(html):
rss_link = html.xpath(site_conf.get("xpath")) rss_link = html.xpath(site_conf.get("xpath"))
if rss_link: if rss_link:
return str(rss_link[-1]), "" return str(rss_link[-1]), ""
+2 -2
View File
@@ -34,7 +34,7 @@ class DiscuzUserInfo(SiteParserBase):
:return: :return:
""" """
html = etree.HTML(html_text) html = etree.HTML(html_text)
if not html: if not StringUtils.is_valid_html_element(html):
return None return None
# 用户等级 # 用户等级
@@ -77,7 +77,7 @@ class DiscuzUserInfo(SiteParserBase):
:return: 下页地址 :return: 下页地址
""" """
html = etree.HTML(html_text) html = etree.HTML(html_text)
if not html: if not StringUtils.is_valid_html_element(html):
return None return None
size_col = 3 size_col = 3
+1 -1
View File
@@ -82,7 +82,7 @@ class FileListSiteUserInfo(SiteParserBase):
:return: 下页地址 :return: 下页地址
""" """
html = etree.HTML(html_text) html = etree.HTML(html_text)
if not html: if not StringUtils.is_valid_html_element(html):
return None return None
size_col = 6 size_col = 6
+2 -2
View File
@@ -65,7 +65,7 @@ class GazelleSiteUserInfo(SiteParserBase):
:return: :return:
""" """
html = etree.HTML(html_text) html = etree.HTML(html_text)
if not html: if not StringUtils.is_valid_html_element(html):
return None return None
# 用户等级 # 用户等级
@@ -95,7 +95,7 @@ class GazelleSiteUserInfo(SiteParserBase):
:return: 下页地址 :return: 下页地址
""" """
html = etree.HTML(html_text) html = etree.HTML(html_text)
if not html: if not StringUtils.is_valid_html_element(html):
return None return None
size_col = 3 size_col = 3
+2 -2
View File
@@ -39,7 +39,7 @@ class IptSiteUserInfo(SiteParserBase):
def _parse_user_detail_info(self, html_text: str): def _parse_user_detail_info(self, html_text: str):
html = etree.HTML(html_text) html = etree.HTML(html_text)
if not html: if not StringUtils.is_valid_html_element(html):
return return
user_levels_text = html.xpath('//tr/th[text()="Class"]/following-sibling::td[1]/text()') user_levels_text = html.xpath('//tr/th[text()="Class"]/following-sibling::td[1]/text()')
@@ -53,7 +53,7 @@ class IptSiteUserInfo(SiteParserBase):
def _parse_user_torrent_seeding_info(self, html_text: str, multi_page: bool = False) -> Optional[str]: def _parse_user_torrent_seeding_info(self, html_text: str, multi_page: bool = False) -> Optional[str]:
html = etree.HTML(html_text) html = etree.HTML(html_text)
if not html: if not StringUtils.is_valid_html_element(html):
return return
# seeding start # seeding start
seeding_end_pos = 3 seeding_end_pos = 3
+1 -1
View File
@@ -42,7 +42,7 @@ class NexusHhanclubSiteUserInfo(NexusPhpSiteUserInfo):
super()._parse_user_detail_info(html_text) super()._parse_user_detail_info(html_text)
html = etree.HTML(html_text) html = etree.HTML(html_text)
if not html: if not StringUtils.is_valid_html_element(html):
return return
# 加入时间 # 加入时间
join_at_text = html.xpath('//*[@id="mainContent"]/div/div[2]/div[4]/div[3]/span[2]/text()[1]') join_at_text = html.xpath('//*[@id="mainContent"]/div/div[2]/div[4]/div[3]/span[2]/text()[1]')
+7 -7
View File
@@ -34,7 +34,7 @@ class NexusPhpSiteUserInfo(SiteParserBase):
:return: :return:
""" """
html = etree.HTML(html_text) html = etree.HTML(html_text)
if not html: if not StringUtils.is_valid_html_element(html):
return return
message_labels = html.xpath('//a[@href="messages.php"]/..') message_labels = html.xpath('//a[@href="messages.php"]/..')
@@ -61,7 +61,7 @@ class NexusPhpSiteUserInfo(SiteParserBase):
self._parse_message_unread(html_text) self._parse_message_unread(html_text)
html = etree.HTML(html_text) html = etree.HTML(html_text)
if not html: if not StringUtils.is_valid_html_element(html):
return return
ret = html.xpath(f'//a[contains(@href, "userdetails") and contains(@href, "{self.userid}")]//b//text()') ret = html.xpath(f'//a[contains(@href, "userdetails") and contains(@href, "{self.userid}")]//b//text()')
@@ -128,7 +128,7 @@ class NexusPhpSiteUserInfo(SiteParserBase):
:param html: :param html:
:return: :return:
""" """
if html: if StringUtils.is_valid_html_element(html):
gold, silver, copper = None, None, None gold, silver, copper = None, None, None
golds = html.xpath('//span[@class = "ucoin-symbol ucoin-gold"]//text()') golds = html.xpath('//span[@class = "ucoin-symbol ucoin-gold"]//text()')
@@ -155,7 +155,7 @@ class NexusPhpSiteUserInfo(SiteParserBase):
:return: 下页地址 :return: 下页地址
""" """
html = etree.HTML(str(html_text).replace(r'\/', '/')) html = etree.HTML(str(html_text).replace(r'\/', '/'))
if not html: if not StringUtils.is_valid_html_element(html):
return None return None
# 首页存在扩展链接,使用扩展链接 # 首页存在扩展链接,使用扩展链接
@@ -223,7 +223,7 @@ class NexusPhpSiteUserInfo(SiteParserBase):
:return: :return:
""" """
html = etree.HTML(html_text) html = etree.HTML(html_text)
if not html: if not StringUtils.is_valid_html_element(html):
return return
self._get_user_level(html) self._get_user_level(html)
@@ -340,7 +340,7 @@ class NexusPhpSiteUserInfo(SiteParserBase):
def _parse_message_unread_links(self, html_text: str, msg_links: list) -> Optional[str]: def _parse_message_unread_links(self, html_text: str, msg_links: list) -> Optional[str]:
html = etree.HTML(html_text) html = etree.HTML(html_text)
if not html: if not StringUtils.is_valid_html_element(html):
return None return None
message_links = html.xpath('//tr[not(./td/img[@alt="Read"])]/td/a[contains(@href, "viewmessage")]/@href') message_links = html.xpath('//tr[not(./td/img[@alt="Read"])]/td/a[contains(@href, "viewmessage")]/@href')
@@ -355,7 +355,7 @@ class NexusPhpSiteUserInfo(SiteParserBase):
def _parse_message_content(self, html_text): def _parse_message_content(self, html_text):
html = etree.HTML(html_text) html = etree.HTML(html_text)
if not html: if not StringUtils.is_valid_html_element(html):
return None, None, None return None, None, None
# 标题 # 标题
message_head_text = None message_head_text = None
+1 -1
View File
@@ -63,7 +63,7 @@ class SmallHorseSiteUserInfo(SiteParserBase):
:return: 下页地址 :return: 下页地址
""" """
html = etree.HTML(html_text) html = etree.HTML(html_text)
if not html: if not StringUtils.is_valid_html_element(html):
return None return None
size_col = 6 size_col = 6
+1 -1
View File
@@ -67,7 +67,7 @@ class TorrentLeechSiteUserInfo(SiteParserBase):
:return: 下页地址 :return: 下页地址
""" """
html = etree.HTML(html_text) html = etree.HTML(html_text)
if not html: if not StringUtils.is_valid_html_element(html):
return None return None
size_col = 2 size_col = 2
+2 -2
View File
@@ -40,7 +40,7 @@ class Unit3dSiteUserInfo(SiteParserBase):
:return: :return:
""" """
html = etree.HTML(html_text) html = etree.HTML(html_text)
if not html: if not StringUtils.is_valid_html_element(html):
return None return None
# 用户等级 # 用户等级
@@ -64,7 +64,7 @@ class Unit3dSiteUserInfo(SiteParserBase):
:return: 下页地址 :return: 下页地址
""" """
html = etree.HTML(html_text) html = etree.HTML(html_text)
if not html: if not StringUtils.is_valid_html_element(html):
return None return None
size_col = 9 size_col = 9
+4 -2
View File
@@ -1,5 +1,7 @@
from lxml import etree from lxml import etree
from app.utils.string import StringUtils
class SiteUtils: class SiteUtils:
@@ -11,7 +13,7 @@ class SiteUtils:
:return: :return:
""" """
html = etree.HTML(html_text) html = etree.HTML(html_text)
if not html: if not StringUtils.is_valid_html_element(html):
return False return False
# 存在明显的密码输入框,说明未登录 # 存在明显的密码输入框,说明未登录
if html.xpath("//input[@type='password']"): if html.xpath("//input[@type='password']"):
@@ -39,7 +41,7 @@ class SiteUtils:
:return True已签到 False未签到 :return True已签到 False未签到
""" """
html = etree.HTML(html_text) html = etree.HTML(html_text)
if not html: if not StringUtils.is_valid_html_element(html):
return False return False
# 站点签到支持的识别XPATH # 站点签到支持的识别XPATH
xpaths = [ xpaths = [
+10
View File
@@ -795,3 +795,13 @@ class StringUtils:
:return: 如果输入值不是 None,返回去除空白字符后的字符串,否则返回 None :return: 如果输入值不是 None,返回去除空白字符后的字符串,否则返回 None
""" """
return value.strip() if value is not None else None return value.strip() if value is not None else None
@staticmethod
def is_valid_html_element(elem) -> bool:
"""
检查elem是否为有效的HTML元素。元素必须为非None并且具有非零长度。
:param elem: 要检查的HTML元素
:return: 如果elem有效(非None且长度大于0),返回True;否则返回False
"""
return elem is not None and len(elem) > 0